home *** CD-ROM | disk | FTP | other *** search
/ PCDisk Magazine Disks / PCDisk Magazine - Disk 2.img / STOKBOND.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1984-11-12  |  47.6 KB  |  1,411 lines

  1. 1  '* * * * * * * * * * * * * * STOKBOND.BAS * * * * * * * * * * * * * * * *
  2. 2  '* * * * (C) COPYRIGHT 1984 DOUGLAS F. HENWOOD--ALL RIGHTS RESERVED * * *
  3. 3  '                             ver 0.999
  4. 4  CLEAR ,,2000:LOCATE ,,1:KEY OFF:FOR N%=1 TO 10:KEY N%,"":NEXT:WIDTH 80
  5. 6  SCR.WID%=80:SCR.PTS%=20:PROG.SCR%=5:DEF FNCT%(FEELD$)=INT((SCR.WID%-LEN(FEELD$))/2)
  6. 8  HOR.LIN%=196:VER.LIN%=179:JOINT%=195:L.L.CORNER%=192:NOTCH%=193:GOSUB 10000
  7. 11  OPTION BASE 1:DIM MENU.PROMPT$(10):DIM WHOLE.REC.BUF$(100)
  8. 12  DIM VAL.BUF!(300,4):DIM IO.BUF$(20,4):DIM FLD.PTR$(20,2,2):DIM STK.INX$(20)
  9. 13  DEF FNPS$(A$)=MKS$(VAL(A$)):DEF FNUS$(A$)=STR$(CVS(A$))
  10. 14  DEF FNEXTRACT$(X$,N%)=MID$(X$,((N%-1)*4)+1,4):DEF FNSTK.EXTRACT$(X$,N%)=MID$(X$,((N%-1)*8)+1,8)
  11. 15  DEF FNNUM.EXTRACT!(X$,N%)=CVS(FNEXTRACT$(X$,N%)):DEF FNSTRIP$(X!)=RIGHT$(STR$(X!),LEN(STR$(X!))-1)
  12. 17  DEF FNROW%(X$)=VAL(LEFT$(X$,2))+PROG.SCR%:DEF FNCOL%(X$)=VAL(RIGHT$(X$,2))
  13. 18  DEF FNUPPER%(A$)=ASC(A$)>=65 AND ASC(A$)<=90:DEF FNLOWER%(A$)=ASC(A$)>=97 AND ASC(A$)<=122
  14. 22  DEF FNLETTER%(A$)=A$=" " OR ASC(A$)>=65 AND ASC(A$)<=122 AND NOT (ASC(A$)>=91 AND ASC(A$)<=96)
  15. 24  DEF FNOP%(A$)=ASC(A$)>=39 AND ASC(A$)<=47 AND ASC(A$)<>44
  16. 26  DEF FNCONTROL%(A$)=ASC(A$)<=31:DEF FNNUMBER%(A$)=ASC(A$)>=48 AND ASC(A$)<=57
  17. 30  DEF FNNUMOP%(A$)=FNNUMBER%(A$) OR FNOP%(A$) OR A$=" ":DEF FNPC!(OLD!,NW!)=(NW!-OLD!)/OLD!*100
  18. 32  DEF FNTOUPPER$(A$)=CHR$(ASC(A$)-32):DEF FNFOLD$(A$)=CHR$(ASC(A$)+(ASC(A$)>90)*32)
  19. 34  UP.ARROW%=72:DOWN.ARROW%=80:LFT.ARROW%=75:RT.ARROW%=77:F1%=59:F2%=60
  20. 36  DEF FNARROW%(A%)=(A%=UP.ARROW% OR A%=DOWN.ARROW% OR A%=LFT.ARROW% OR A%=RT.ARROW%)
  21. 38  BS$=CHR$(29)+CHR$(32)+CHR$(29):DEF FNA!(DBD%,Y.LEN%)=(DBD%/(2*Y.LEN%))-0.25
  22. 43  DEF FNB!(DBD%,Y.LEN%)=(DBD%/Y.LEN%):DEF FNC!(P!)=(P!-100)/P!
  23. 45  DEF FNQUAD!(A!,B!,C!)=((((B!^2)-(4*A!*C!))^0.5)-B!)/(2*A!)
  24. 47  DEF FNTRIN!(X$)=(CVS(FNEXTRACT$(X$,8))/CVS(FNEXTRACT$(X$,9)))/(CVS(FNEXTRACT$(X$,12))/CVS(FNEXTRACT$(X$,13)))
  25. 48  DEF FNAD!(X$)=CVS(FNEXTRACT$(X$,8))-CVS(FNEXTRACT$(X$,9))
  26. 50  D.T.L$="That date is too late":D.T.E$="That date is too early":N.E.D$="There is not enough data to do that"
  27. 1000  MAX.COL%=2:MAX.ROW%=11
  28. 1005  FOR MOD.TYP%=1 TO 2:FOR ROW%=1 TO MAX.ROW%:FOR COL%=1 TO MAX.COL%:READ FLD.PTR$(ROW%,COL%,MOD.TYP%):NEXT:NEXT:NEXT
  29. 1070  DATA 1,0,2,3,4,5,6,7,8,0,9,0,10,0,11,0,12,0,13,0,14,15
  30. 1075  DATA 1,0,2,0,3,0,4,6,5,0,7,10,8,11,9,12,13,0,14,0,15,0
  31. 2000  FOR N%=1 TO 7000:NEXT:LOCATE ,,1
  32. 2001  ON ERROR GOTO 60000
  33. 2002  CLS:LOCATE 24,1:PRINT "What drive are your data files on?";
  34. 2004  X%=24:Y%=36:MAX.LN%=1:TEST.TYP%=3:GOSUB 44000
  35. 2006  IF NOT FNLETTER%(INP.TMP$) THEN PRINT CHR$(7)+BS$;:GOTO 2002
  36. 2008  DR$=INP.TMP$
  37. 9998  GOTO 11000
  38. 9999  '
  39. 10000  CLS:PR.ST$="S T O C K   A N D   B O N D   A N A L Y S T":COLOR 15,0
  40. 10002  LOCATE 4,FNCT%(PR.ST$),0:PRINT PR.ST$:COLOR 7,0
  41. 10003  PR.ST$="for PC Disk--ver 1.0":LOCATE 5,FNCT%(PR.ST$):PRINT PR.ST$
  42. 10004  PR.ST$="(c)  COPYRIGHT 1984 BY DOUGLAS F. HENWOOD"
  43. 10005  LOCATE 6,FNCT%(PR.ST$):PRINT PR.ST$
  44. 10006  PR.ST$="All rights reserved."
  45. 10007  LOCATE 7,FNCT%(PR.ST$):PRINT PR.ST$:GOSUB 10050
  46. 10008  LOCATE 10,10
  47. 10009  PRINT "Nothing in this program should be construed as investment
  48. 10010  PRINT TAB(10) "advice, or recommendations of the purchase or sale of any
  49. 10011  PRINT TAB(10) "securities, or the advocacy of any strategy. It assumes a
  50. 10012  PRINT TAB(10) "sophisticated knowledge of the securities markets, and is
  51. 10013  PRINT TAB(10) "designed to help experienced investors keep track of some
  52. 10014  PRINT TAB(10) "widely followed indicators and to apply classic techniques
  53. 10015  PRINT TAB(10) "to market analysis. Neither the author of the program nor
  54. 10016  PRINT TAB(10) "its publisher assume any responsibility for investment
  55. 10017  PRINT TAB(10) "losses suffered by the users of this program."
  56. 10020  PRINT:PRINT TAB(10) "Reproduction or alteration of this program in whole or
  57. 10021  PRINT TAB(10) "in part for any purpose other than making backup copies
  58. 10022  PRINT TAB(10) "for the exclusive use of the original user is forbidden.";
  59. 10026  RETURN
  60. 10050  X.TOP%=3:X.BOT%=8:Y.LFT%=14:Y.RT%=64:ULC$=CHR$(218):LRC$=CHR$(217):LLC$=CHR$(192):URC$=CHR$(191)
  61. 10054    LOCATE X.TOP%,Y.LFT%:PRINT STRING$(50,HOR.LIN%):LOCATE X.BOT%,Y.LFT%:PRINT STRING$(50,HOR.LIN%)
  62. 10057    LOCATE X.TOP%,Y.RT%:PRINT URC$:LOCATE X.BOT%,Y.RT%:PRINT LRC$
  63. 10058    FOR X%=X.TOP%+1 TO X.BOT%-1:LOCATE X%,Y.LFT%:PRINT CHR$(VER.LIN%):NEXT
  64. 10060    LOCATE X.TOP%,Y.LFT%:PRINT ULC$:LOCATE X.BOT%,Y.LFT%:PRINT LLC$
  65. 10061    FOR X%=X.TOP%+1 TO X.BOT%-1:LOCATE X%,Y.RT%:PRINT CHR$(VER.LIN%):NEXT
  66. 10062  RETURN
  67. 10999  '
  68. 11000  PROG.NAM$="STOCK/BOND ANALYST":PROG.SECT$="Main menu":GOSUB 40010
  69. 11006  GOSUB 41500:IF ERR.FLAG% THEN 11006 ELSE ERR.FLAG%=0
  70. 11007  DOS.FLAG%=-1
  71. 11010  MAX.CHOICE%=3:MAX.LEN%=0:MENU.PROMPT$(1)="STOCKS":MENU.PROMPT$(2)="BONDS":MENU.PROMPT$(3)="BACKGROUND-DATA SOURCES
  72. 11020  GOSUB 40100 
  73. 11030  IF DONE.FLAG% THEN SYSTEM         
  74. 11035  DOS.FLAG%=0:ON MEN.CHC% GOSUB 20000,30000,25000
  75. 11040  GOTO 11000
  76. 20000  '
  77. 20006  BOND.MOD%=0:PROG.NAM$="STOCK ANALYST":PROG.SECT$="Main menu":GOSUB 40010
  78. 20009  MAX.CHOICE%=3:MAX.LEN%=0
  79. 20011  MENU.PROMPT$(1)="STOCK MARKET MODEL":MENU.PROMPT$(2)="STOCK PRICE HISTORY"
  80. 20015  MENU.PROMPT$(MAX.CHOICE%)="STOCK VALUATION ANALYSIS":GOSUB 40100
  81. 20019  IF DONE.FLAG% THEN DONE.FLAG%=0:RETURN
  82. 20021  ON MEN.CHC% GOSUB 21000,22000,23000
  83. 20022  GOTO 20006
  84. 20098  RETURN
  85. 20999  '
  86. 21000  '
  87. 21004  STK.HIS%=0:STK.MOD%=-1
  88. 21005  GOSUB 41015:IF INIT.FLAG% THEN GOSUB 21050
  89. 21006  GOSUB 41020:GOSUB 41030
  90. 21008  GOSUB 42100:GOSUB 41040
  91. 21010  START.DEF%=1:END.DEF%=17:MOD.TYP%=1:PRN.MAX%=15
  92. 21012  OFFSET%=START.DEF%-1:BUF.MAX%=END.DEF%-START.DEF%+1:VOL.FLAG%=0
  93. 21014  GOSUB 42000
  94. 21016  PROG.SECT$="Model main menu":GOSUB 40010
  95. 21018  MAX.CHOICE%=3:MAX.LEN%=0
  96. 21020  MENU.PROMPT$(1)="ENTER/DISPLAY/EDIT DATA":MENU.PROMPT$(2)="GRAPH DATA"
  97. 21024  MENU.PROMPT$(MAX.CHOICE%)="MARKET SNAPSHOT":GOSUB 40100
  98. 21028  IF DONE.FLAG% THEN DONE.FLAG%=0:RETURN
  99. 21030  ON MEN.CHC% GOSUB 21200,21400,21600
  100. 21032  GOTO 21016
  101. 21035  RETURN
  102. 21039  '
  103. 21050  GOSUB 50950:START.DAT%=DT.INT%:CUR.DAT%=0:LAST.REC%=1
  104. 21055  GOSUB 41020:GOSUB 41030:GOSUB 42200:GOSUB 41040:REC.NUM%=2:GOSUB 42900
  105. 21057  RETURN
  106. 21059  '
  107. 21199  '
  108. 21200  '
  109. 21205  PROG.SECT$="Disp/edit/add model data":GOSUB 40010
  110. 21207  REDO.FLAG%=0
  111. 21208  CLOSE:GOSUB 41020:GOSUB 41030:GOSUB 42100:GOSUB 41040
  112. 21210  GOSUB 40200:GOSUB 42300
  113. 21212  IF DAT$="" THEN RETURN ELSE ON DAT.BRANCH% GOSUB 21300,21350
  114. 21217  IF REDO.FLAG% THEN 21207 
  115. 21220  RETURN
  116. 21299  '
  117. 21300  '
  118. 21306  PROG.SECT$="Display/edit model data":GOSUB 40010:GOSUB 40200
  119. 21308  REC.NUM%=CUR.DAT%-START.DAT%+2
  120. 21310  GET#1,REC.NUM%
  121. 21312  REC.BUF$=RECORD$
  122. 21316  GOSUB 42800:REPORT.DO%=-1:PRN.MAX%=BUF.MAX%-2
  123. 21318  GOSUB 42500
  124. 21319  GOSUB 42700:GOSUB 42775
  125. 21321  IF EDIT.BRANCH%=1 THEN GOSUB 43002:RETURN
  126. 21323  IF EDIT.BRANCH%=2 THEN REDO.FLAG%=-1:RETURN
  127. 21329  IF EDIT.BRANCH%=3 THEN REDO.FLAG%=0:RETURN
  128. 21331  RETURN
  129. 21349  '
  130. 21350  '
  131. 21356  PROG.SECT$="Enter new data":GOSUB 40010:GOSUB 40200 
  132. 21357  REC.NUM%=CUR.DAT%-START.DAT%+2
  133. 21358  IF REC.NUM%>LAST.REC%+1 THEN GOSUB 42900
  134. 21360  REPORT.DO%=0:PRN.MAX%=BUF.MAX%-2:GOSUB 42500 
  135. 21362  TEST.TYP%=2:MAX.LN%=10:GOSUB 42600
  136. 21364  GOSUB 42700:GOSUB 42775
  137. 21366  IF EDIT.BRANCH%=1 THEN GOSUB 43002:RETURN
  138. 21372  IF EDIT.BRANCH%=2 THEN GOSUB 42850:LAST.REC%=REC.NUM%:GOSUB 41030:GOSUB 42200
  139. 21374  RETURN
  140. 21400  '
  141. 21402  PROG.SECT$="Graph data":GOSUB 40010
  142. 21404  GOSUB 42375:IF DAT$="" THEN RETURN ELSE START.REC%=DT.INT%-START.DAT%+2
  143. 21406  GRAFIX.FLAG%=0
  144. 21407  IF GRAFIX.FLAG% THEN H.POINTS%=100 ELSE H.POINTS%=75
  145. 21412  MENU.PROMPT$(1)="Price/moving avg/volume"
  146. 21413  MENU.PROMPT$(2)="Single indicator"
  147. 21414  MENU.PROMPT$(3)="Two indicators"
  148. 21415  MAX.CHOICE%=3:GOSUB 40100
  149. 21420  IF DONE.FLAG% THEN DONE.FLAG%=0:RETURN
  150. 21422  GRAF.TYP%=MEN.CHC%:ON GRAF.TYP% GOSUB 46000,46016,46030
  151. 21434  RETURN
  152. 21600  '
  153. 21602  PROG.SECT$="Market snapshot":GOSUB 40010
  154. 21604  GOSUB 41020:GOSUB 41030:GOSUB 42100:GOSUB 41040:GOSUB 40200:GOSUB 42350
  155. 21606  REC.NUM.START%=CUR.DAT%-START.DAT%+2:IF REC.NUM.START%<12 THEN ERROR 118
  156. 21608  FILL.COUNT%=10:GOSUB 42880
  157. 21610  TRIN.CUM!=0:VOL.CUM!=0:UP.VOL.CUM!=0:AD.DIFF!=0
  158. 21612  FOR N%=1 TO FILL.COUNT%
  159. 21614   REC.TMP$=WHOLE.REC.BUF$(N%)
  160. 21616   TRIN.CUM!=TRIN.CUM!+FNTRIN!(REC.TMP$)
  161. 21617   AD.DIFF!=FNAD!(REC.TMP$)+AD.DIFF!
  162. 21618   VOL.CUM!=VOL.CUM!+CVS(FNEXTRACT$(REC.TMP$,11))
  163. 21620   UP.VOL.CUM!=UP.VOL.CUM!+CVS(FNEXTRACT$(REC.TMP$,12))
  164. 21622  NEXT
  165. 21624  REC.TMP$=WHOLE.REC.BUF$(10)
  166. 21626  VOL.LAST!=CVS(FNEXTRACT$(REC.TMP$,11))
  167. 21630  LOCATE 1,60:PRINT SPACE$(19):LOCATE 1,60:PRINT "Report for " DT.PRN$
  168. 21631  LOCATE 2,60:PRINT SPACE$(19):LOCATE 3,60:PRINT SPACE$(19);
  169. 21632  COLOR 15,0:LOCATE 6,5:PRINT "Index";:LOCATE 6,25:PRINT "Last" 
  170. 21634  LOCATE 6,40:PRINT "5-day change":LOCATE 6,55:PRINT "10-day change":COLOR 7,0
  171. 21636  INX.DESC.TMP$="Dow Jones Indus":DOW!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(10),1))
  172. 21638    DOW.5!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(5),1)):DOW.10!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(1),1))
  173. 21640      INX.TMP!=DOW!:INX.TMP.5!=DOW.5!:INX.TMP.10!=DOW.10!:X%=8:GOSUB 21682
  174. 21642  INX.DESC.TMP$="S & P 500":SP!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(10),2))
  175. 21644    SP.5!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(5),2)):SP.10!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(1),2))
  176. 21646      INX.TMP!=SP!:INX.TMP.5!=SP.5!:INX.TMP.10!=SP.10!:X%=9:GOSUB 21682
  177. 21648  INX.DESC.TMP$="NYSE Composite":NYSE!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(10),4))
  178. 21650    NYSE.5!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(5),4)):NYSE.10!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(1),4))
  179. 21652      INX.TMP!=NYSE!:INX.TMP.5!=NYSE.5!:INX.TMP.10!=NYSE.10!:X%=10:GOSUB 21682
  180. 21654  INX.DESC.TMP$="Value Line":VL!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(10),6))
  181. 21656    VL.5!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(5),6)):VL.10!=CVS(FNEXTRACT$(WHOLE.REC.BUF$(1),6))
  182. 21658      INX.TMP!=VL!:INX.TMP.5!=VL.5!:INX.TMP.10!=VL.10!:X%=11:GOSUB 21682
  183. 21660  LOCATE 13,10:PRINT "Last volume":LOCATE 13,40:PRINT USING "###.##";VOL.LAST!/1000;:PRINT " million"
  184. 21664  LOCATE 14,10:PRINT "10-day avg vol":LOCATE 14,40:PRINT USING "###.##";VOL.CUM!/10000;:PRINT " million"
  185. 21668  LOCATE 15,10:PRINT "10-day cum up vol":LOCATE 15,40:PRINT USING "###.##";UP.VOL.CUM!/1000;:PRINT " million"
  186. 21672  LOCATE 17,10:PRINT "10-day adv/decl diff":LOCATE 17,40:PRINT USING "+#####";AD.DIFF!
  187. 21676  LOCATE 19,10:PRINT "10-day TRIN":LOCATE 19,40:PRINT USING "##.##";TRIN.CUM!/10
  188. 21679  GOSUB 42740:GOSUB 44200
  189. 21680  '
  190. 21682  '
  191. 21684  LOCATE X%,5:PRINT INX.DESC.TMP$:LOCATE X%,25:PRINT USING "####.##";INX.TMP!
  192. 21688  LOCATE X%,40:PRINT USING "+###.##";FNPC(INX.TMP.5!,INX.TMP!)
  193. 21690  LOCATE X%,55:PRINT USING "+###.##";FNPC(INX.TMP.10!,INX.TMP!)
  194. 21692  RETURN
  195. 21694  '
  196. 21999  '
  197. 22000  GOSUB 41145:IF INIT.FLAG% THEN GOSUB 22050
  198. 22002  CLOSE:GOSUB 41150
  199. 22003  GOSUB 41160:GOSUB 42100:GOSUB 41170:GOSUB 42450
  200. 22004  STK.HIS%=-1:BOND.MOD%=0:PROG.NAM$="STOCK ANALYST"
  201. 22005  PROG.SECT$="Stock price history main menu":GOSUB 40010
  202. 22006  MAX.CHOICE%=6:MAX.LEN%=0
  203. 22010  MENU.PROMPT$(1)="INITIALIZE A NEW STOCK"
  204. 22012  MENU.PROMPT$(2)="DELETE A STOCK"
  205. 22015  MENU.PROMPT$(3)="DISPLAY/EDIT HEAD INFORMATION"
  206. 22020  MENU.PROMPT$(4)="ENTER/DISPLAY/EDIT PRICE/VOLUME DATA"
  207. 22023  MENU.PROMPT$(5)="ADJUST FOR SPLIT"
  208. 22025  MENU.PROMPT$(MAX.CHOICE%)="GRAPH DATA"
  209. 22030  GOSUB 40100
  210. 22035  IF DONE.FLAG% THEN DONE.FLAG%=0:RETURN
  211. 22040  ON MEN.CHC% GOSUB 22300,22350,22400,22500,22600,22650
  212. 22042  GOTO 22002
  213. 22045  RETURN
  214. 22050  GOSUB 50950:START.DAT%=DT.INT%:CUR.DAT%=0:LAST.REC%=1
  215. 22055  GOSUB 41150:GOSUB 41160:GOSUB 42200:GOSUB 41040:REC.NUM%=22:GOSUB 42900
  216. 22057  RETURN
  217. 22099  '
  218. 22100  '
  219. 22101  '
  220. 22199  '
  221. 22300  PROG.SECT$="Initialize stock"+STR$(STK.MAX%+1):GOSUB 40010
  222. 22302  IF STK.MAX%=20 THEN ERROR 108
  223. 22305  START.DEF%=51:END.DEF%=56:OFFSET%=START.DEF%-1:GOSUB 42000
  224. 22310  REC.NUM%=STK.MAX%+2:BUF.MAX%=END.DEF%-START.DEF%+1:PRN.MAX%=BUF.MAX%
  225. 22317  REPORT.DO%=0:GOSUB 42500:TEST.TYP%=3:MAX.LN%=16:GOSUB 42600:GOSUB 42700:GOSUB 42775
  226. 22327  IF EDIT.BRANCH%=3 THEN RETURN
  227. 22328  IF EDIT.BRANCH%=1 THEN TEST.TYP%=3:MAX.LN%=16:GOSUB 43500
  228. 22329  IF EDIT.BRANCH%=2 THEN WRITE.FLAG%=-1
  229. 22330  IF WRITE.FLAG% THEN GOSUB 42250
  230. 22349  RETURN
  231. 22350  PROG.SECT$="Delete a stock":GOSUB 40010
  232. 22351  GOSUB 42475:GOSUB 42485:IF STK.NUM%=0 THEN RETURN
  233. 22352  GOSUB 42795:IF NOT CONFIRM.FLAG% THEN RETURN:ELSE LOCATE 23,1:PRINT SPACE$(79);:LOCATE 23,1:PRINT "Ready to delete " STK.INX$(STK.NUM%) "; press any key to continue, ESC to abort";:TMP$=INPUT$(1):IF TMP$=CHR$(27) THEN RETURN
  234. 22353  LOCATE 23,1:PRINT SPACE$(79);:GOSUB 42785:START.REC%=STK.NUM%+1:GOSUB 41180
  235. 22354  FOR REC%=START.REC% TO 20
  236. 22355    GET #1,REC%+1:REC.TMP$=RECORD$:LSET RECORD$=STRING$(160,0):PUT #1,REC%+1
  237. 22356     LSET RECORD$=REC.TMP$:PUT #1,REC%
  238. 22357  NEXT
  239. 22358  FOR REC%=22 TO LAST.REC%
  240. 22359    GET #1,REC%
  241. 22361    REC.TMP$=RECORD$:IF REC.TMP$=STRING$(160,0) THEN 22365
  242. 22363    REC.TMP$=LEFT$(REC.TMP$,(STK.NUM%-1)*8)+RIGHT$(REC.TMP$,160-(STK.NUM%*8))+STRING$(8,0)
  243. 22364    LSET RECORD$=REC.TMP$:PUT #1,REC%
  244. 22365  NEXT
  245. 22367  RETURN
  246. 22399  '
  247. 22400  '
  248. 22405  PROG.SECT$="Display/edit stock data":GOSUB 40010
  249. 22407  START.DEF%=51:END.DEF%=56:OFFSET%=START.DEF%-1
  250. 22408  BUF.MAX%=END.DEF%-START.DEF%+1:GOSUB 42000 
  251. 22411  GOSUB 42475:GOSUB 42485:REC.NUM%=VAL(INP.TMP$)+1:GOSUB 41170:GET #1,REC.NUM% 
  252. 22419  GOSUB 42275:PRN.MAX%=BUF.MAX%:REPORT.DO%=-1:GOSUB 42500
  253. 22423  GOSUB 42700:GOSUB 42775
  254. 22425  IF EDIT.BRANCH%=3 THEN RETURN
  255. 22426  IF EDIT.BRANCH%=1 THEN TEST.TYP%=3:MAX.LN%=16:GOSUB 43500
  256. 22427  IF EDIT.BRANCH%=2 THEN WRITE.FLAG%=-1
  257. 22429  IF WRITE.FLAG% THEN GOSUB 42250
  258. 22430  RETURN
  259. 22499  '
  260. 22500  REDO.FLAG%=0:ERR.FLAG%=0
  261. 22510  PROG.SECT$="Enter/display/edit price history data":GOSUB 40010:GOSUB 42450:IF STK.MAX%=0 THEN ERROR 109
  262. 22511  GOSUB 40200:GOSUB 42300:GOSUB 41180:REC.NUM%=CUR.DAT%-START.DAT%+22
  263. 22516  IF DAT$="" THEN RETURN ELSE ON DAT.BRANCH% GOSUB 22550,22575
  264. 22520  RETURN
  265. 22550  '
  266. 22560  PROG.SECT$="Display/edit price/volume data":GOSUB 40010:GOSUB 40200
  267. 22562  GET #1,REC.NUM%:REC.BUF$=RECORD$:GOSUB 42950
  268. 22566  REPORT.DO%=-1:GOSUB 42550:GOSUB 42700:GOSUB 42775
  269. 22570  IF EDIT.BRANCH%=1 THEN GOSUB 43750:RETURN
  270. 22571  IF EDIT.BRANCH%=2 THEN REDO.FLAG%=-1:RETURN
  271. 22572  IF EDIT.BRANCH%=3 THEN REDO.FLAG%=0:RETURN
  272. 22574  '
  273. 22575  PROG.SECT$="Enter price/volume data":GOSUB 40010:REPORT.DO%=0:GOSUB 42550
  274. 22576  FOR N%=1 TO STK.MAX%
  275. 22577    IF STK.INX$(N%)=STRING$(8,0) THEN IO.BUF$(N%,1)="0":IO.BUF$(N%,2)="0":GOTO 22590
  276. 22578    X%=(N%+(N%>10)*10)+7:Y%=((N%>10)*-40)+10
  277. 22579    MAX.LN%=10:TEST.TYP%=2:GOSUB 44000:GOSUB 44750:IO.BUF$(N%,1)=INP.TMP$
  278. 22581    MAX.LN%=6:TEST.TYP%=1:Y%=Y%+15:GOSUB 44000:IO.BUF$(N%,2)=INP.TMP$
  279. 22583  NEXT
  280. 22584  GOSUB 42700:GOSUB 42775
  281. 22585  IF EDIT.BRANCH%=3 THEN RETURN
  282. 22586  IF EDIT.BRANCH%=1 THEN GOSUB 43750
  283. 22587  GOSUB 42975:LAST.DAT%=CUR.DAT%:LAST.REC%=REC.NUM%:GOSUB 41160:GOSUB 42200
  284. 22588  RETURN
  285. 22599  '
  286. 22600  PROG.SECT$="Adjust for split":GOSUB 40010
  287. 22601  GOSUB 41180:GOSUB 42475:GOSUB 42485:LOCATE 23,1:PRINT SPACE$(75):LOCATE 23,1:PRINT "Enter ratio (e.g. 3/2)";
  288. 22604  X%=23:Y%=24:MAX.LN%=5:TEST.TYP%=2:GOSUB 44000:GOSUB 44750:IF ERR.FLAG% THEN PRINT CHR$(7);:ERR.FLAG%=0:GOTO 22601
  289. 22608  SPLIT!=VAL(INP.TMP$):IF SPLIT!=0 THEN PRINT CHR$(7);:GOTO 22604
  290. 22609  GOSUB 42795:IF NOT CONFIRM.FLAG% THEN RETURN
  291. 22610  GOSUB 42785
  292. 22611  FOR REC%=22 TO LAST.REC%
  293. 22612    GET #1,REC%:REC.TMP$=RECORD$:SPLIT$=FNSTK.EXTRACT$(REC.TMP$,STK.NUM%)
  294. 22613    PR.TMP!=CVS(LEFT$(SPLIT$,4)):VOL.TMP!=CVS(RIGHT$(SPLIT$,4))
  295. 22615    IF PR.TMP! THEN TST.TMP$=STR$(PR.TMP!/SPLIT!):INT.FLAG%=0:GOSUB 42990:PR.TMP!=TST.TMP#:VOL.TMP!=INT((VOL.TMP!*SPLIT!)+0.5)
  296. 22618    SPLIT$=MKS$(PR.TMP!)+MKS$(VOL.TMP!):MID$(REC.TMP$,((STK.NUM%-1)*8)+1,8)=SPLIT$
  297. 22619    LSET RECORD$=REC.TMP$:PUT #1,REC%
  298. 22620  NEXT
  299. 22625  RETURN
  300. 22649  '
  301. 22650  PROG.SECT$="Graph data":GOSUB 40010
  302. 22654  GOSUB 42375:IF DAT$="" THEN RETURN
  303. 22655  START.REC%=DT.INT%-START.DAT%+22:GRAF.TYP%=1:GOSUB 46000:RETURN
  304. 22999  '
  305. 23000  '
  306. 23302  PROG.SECT$="Graham stock valuation":GOSUB 40010
  307. 23304  START.DEF%=57:END.DEF%=60:OFFSET%=START.DEF%-1:GOSUB 42000
  308. 23306  BUF.MAX%=END.DEF%-START.DEF%+1:REPORT.DO%=0:PRN.MAX%=BUF.MAX%-1
  309. 23308  GOSUB 42500:TEST.TYP%=2:MAX.LN%=10:GOSUB 42600
  310. 23310  GROWTH!=VAL(IO.BUF$(1,1)):EPS!=VAL(IO.BUF$(2,1)):AAA.RATE!=VAL(IO.BUF$(3,1))
  311. 23316  THEO.PRICE!=EPS!*(8.5+2*GROWTH!)*(4.4/AAA.RATE!)
  312. 23318  LOCATE 20,20:PRINT IO.BUF$(4,3);
  313. 23320  LOCATE 20,40:PRINT FNSTRIP$(THEO.PRICE!)
  314. 23322  F1.MSG$="Do another valuation":ESC.MSG$="Return to previous menu":GOSUB 42750
  315. 23323  GOSUB 44200
  316. 23324  IF ASC.RESP%=F1% THEN 23306 ELSE IF ASC.RESP%=27 THEN RETURN ELSE PRINT CHR$(7);:GOTO 23322
  317. 25000  OPEN "I",1,"STOKBOND.TXT":CLS
  318. 25001  LOCATE 1,1:FOR N%=1 TO 23:LINE INPUT #1,LIN$:PRINT LIN$:NEXT
  319. 25002  LOCATE 24,1:PRINT "PRESS ANY KEY TO CONTINUE";:HOOK$=INPUT$(1)
  320. 25004  CLS:FOR N%=1 TO 22:LINE INPUT #1,LIN$:PRINT LIN$:NEXT
  321. 25006  LOCATE 24,1:PRINT "PRESS ANY KEY TO CONTINUE";:HOOK$=INPUT$(1):RETURN
  322. 25007  `
  323. 29999  '
  324. 30000  '
  325. 30006  PROG.NAM$="BOND ANALYST":VOL.FLAG%=0
  326. 30007  PROG.SECT$="Main menu":GOSUB 40010
  327. 30009  MAX.CHOICE%=3:MAX.LEN%=0
  328. 30011  MENU.PROMPT$(1)="BOND MARKET MODEL"
  329. 30015  MENU.PROMPT$(MAX.CHOICE%)="BOND VALUATION ANALYSIS"
  330. 30016  MENU.PROMPT$(MAX.CHOICE%)="DAYS BETWEEN DATES"
  331. 30017  GOSUB 40100
  332. 30019  IF DONE.FLAG% THEN DONE.FLAG%=0:RETURN
  333. 30021  ON MEN.CHC% GOSUB 31000,32000,33000
  334. 30022  GOTO 30006
  335. 30098  RETURN
  336. 30999  '
  337. 31000  '
  338. 31004  MOD.TYP%=2:BOND.MOD%=-1
  339. 31005  GOSUB 41115:IF INIT.FLAG% THEN GOSUB 31050
  340. 31006  GOSUB 41120:GOSUB 41130
  341. 31008  GOSUB 42100:GOSUB 41140
  342. 31010  START.DEF%=18:END.DEF%=32
  343. 31012  OFFSET%=START.DEF%-1:BUF.MAX%=END.DEF%-START.DEF%+1:PRN.MAX%=BUF.MAX%
  344. 31014  GOSUB 42000
  345. 31016  PROG.SECT$="Model main menu":GOSUB 40010
  346. 31018  MAX.CHOICE%=3:MAX.LEN%=0
  347. 31020  MENU.PROMPT$(1)="ENTER/DISPLAY/EDIT DATA
  348. 31022  MENU.PROMPT$(2)="GRAPH DATA
  349. 31024  MENU.PROMPT$(MAX.CHOICE%)="MARKET SNAPSHOT
  350. 31026  GOSUB 40100
  351. 31028  IF DONE.FLAG% THEN DONE.FLAG%=0:RETURN
  352. 31030  ON MEN.CHC% GOSUB 31200,31400,31600
  353. 31031  GOTO 31016
  354. 31032  RETURN
  355. 31050  GOSUB 50950:START.DAT%=DT.INT%:CUR.DAT%=0:LAST.REC%=1
  356. 31055  GOSUB 41120:GOSUB 41130:GOSUB 42200:GOSUB 41140:REC.NUM%=2:GOSUB 42900
  357. 31057  RETURN
  358. 31099  '
  359. 31200  '
  360. 31203  '
  361. 31205  PROG.SECT$="Enter/display/edit model data":GOSUB 40010
  362. 31206  REDO.FLAG%=0
  363. 31207  GOSUB 40200:GOSUB 42300
  364. 31209  IF DAT$="" THEN RETURN ELSE ON DAT.BRANCH% GOSUB 31300,31350
  365. 31211  RETURN
  366. 31299  '
  367. 31300  '
  368. 31306  PROG.SECT$="Display/edit model data":GOSUB 40010:GOSUB 40200
  369. 31308  GOSUB 42400:GOSUB 40200:GET #1,REC.NUM%:REC.BUF$=RECORD$
  370. 31316  GOSUB 42800:REPORT.DO%=-1:GOSUB 42500:GOSUB 42700:GOSUB 42775
  371. 31321  IF EDIT.BRANCH%=1 THEN GOSUB 43002:RETURN
  372. 31323  IF EDIT.BRANCH%=2 THEN REDO.FLAG%=-1:RETURN
  373. 31329  IF EDIT.BRANCH%=3 THEN REDO.FLAG%=0:RETURN
  374. 31349  '
  375. 31350  '
  376. 31356  PROG.SECT$="Enter new model data":GOSUB 40010:GOSUB 40200 
  377. 31357  REC.NUM%=LAST.REC%+1
  378. 31360  REPORT.DO%=0:GOSUB 42500
  379. 31362  TEST.TYP%=2:MAX.LN%=10:GOSUB 42600
  380. 31364  GOSUB 42700:GOSUB 42775
  381. 31366  IF EDIT.BRANCH%=1 THEN GOSUB 43002:RETURN
  382. 31368  IF EDIT.BRANCH%=2 THEN GOSUB 42850:LAST.REC%=REC.NUM%:GOSUB 41130:GOSUB 42200
  383. 31370  RETURN
  384. 31399  '
  385. 31400  '
  386. 31402  PROG.SECT$="Graph data":GOSUB 40010:GOSUB 40200
  387. 31404  GOSUB 42375:IF DAT$="" THEN RETURN ELSE LOCATE 23,1:PRINT SPACE$(79);
  388. 31405  CUR.DAT%=DT.INT%:GOSUB 42400:START.REC%=REC.NUM%
  389. 31413  MENU.PROMPT$(1)="Single indicator"
  390. 31414  MENU.PROMPT$(2)="Two indicators"
  391. 31415  MAX.CHOICE%=2:GOSUB 40100
  392. 31420  IF DONE.FLAG% THEN DONE.FLAG%=0:RETURN
  393. 31422  GRAF.TYP%=MEN.CHC%+1:ON GRAF.TYP%-1 GOSUB 46016,46030
  394. 31424  RETURN
  395. 31429  '
  396. 31600  '
  397. 31602  PROG.SECT$="Market snapshot":GOSUB 40010
  398. 31604  GOSUB 41120:GOSUB 41130:GOSUB 42100:GOSUB 41140:GOSUB 40200:GOSUB 42350
  399. 31605  GOSUB 42400:REC.NUM.START%=REC.NUM%:IF REC.NUM.START%<4 THEN ERROR 120
  400. 31606  FILL.COUNT%=3:GOSUB 42880
  401. 31608  REC.TMP$=WHOLE.REC.BUF$(1):NFR.1!=CVS(FNEXTRACT$(REC.TMP$,15))
  402. 31610  REC.TMP$=WHOLE.REC.BUF$(2):NFR.2!=CVS(FNEXTRACT$(REC.TMP$,15))
  403. 31612  REC.TMP$=WHOLE.REC.BUF$(3):NFR.3!=CVS(FNEXTRACT$(REC.TMP$,15))
  404. 31613  LOCATE 1,60:PRINT SPACE$(19):LOCATE 1,60:PRINT "Report for " CUR.PRN$
  405. 31614  LOCATE 2,60:PRINT SPACE$(19):LOCATE 3,60:PRINT SPACE$(19);
  406. 31615  IF NFR.1!=NFR.2! THEN NFR.AVG!=(NFR.1!+NFR.3!)/2 ELSE NFR.AVG!=(NFR.1!+NFR.2!)/2
  407. 31618  DISC.RT!=CVS(FNEXTRACT$(REC.TMP$,1)):FED.FUNDS!=CVS(FNEXTRACT$(REC.TMP$,2))
  408. 31620  COMM.PAPER!=CVS(FNEXTRACT$(REC.TMP$,3)):T.BILL.3MO!=CVS(FNEXTRACT$(REC.TMP$,4))
  409. 31622  T.BOND.30YR!=CVS(FNEXTRACT$(REC.TMP$,12)):MUNI!=CVS(FNEXTRACT$(REC.TMP$,13))
  410. 31624  LOCATE 10,10:COLOR 15,0:PRINT "Spreads";:COLOR 7,0
  411. 31626  LOCATE 12,15:PRINT "Discount rate - Fed funds";
  412. 31628  LOCATE 12,50:PRINT USING "+###.##";DISC.RT!-FED.FUNDS! 
  413. 31630  LOCATE 13,15:PRINT "Comm paper - 3 mo T-bills";:
  414. 31632  LOCATE 13,50:PRINT USING "+###.##";COMM.PAPER!-T.BILL.3MO!
  415. 31634  LOCATE 14,15:PRINT "30-yr T-bonds - 3 mo T-bills";
  416. 31636  LOCATE 14,50:PRINT USING "+###.##";T.BOND.30YR!-T.BILL.3MO!
  417. 31638  LOCATE 15,15:PRINT "30-yr T-bonds - long muni";:
  418. 31640  LOCATE 15,50:PRINT USING "+###.##";T.BOND.30YR!-MUNI!
  419. 31642  LOCATE 20,15:PRINT "4-wk avg, net "; 
  420. 31644  IF NFR.AVG!<0 THEN PRINT "borrowed";: ELSE PRINT "free";
  421. 31646  PRINT " res";:LOCATE 20,50:PRINT USING "+###.##";NFR.AVG!;:PRINT "   (billion)" 
  422. 31647  GOSUB 42740:GOSUB 44200
  423. 31648  RETURN
  424. 31650  '
  425. 32000  '
  426. 32002  PROG.SECT$="Analyze individual bond":GOSUB 40010
  427. 32003  MAX.CHOICE%=2:MAX.LEN%=0:MENU.PROMPT$(1)="TREASURY BILL"
  428. 32006  MENU.PROMPT$(MAX.CHOICE%)="NOTE OR BOND":GOSUB 40100
  429. 32012  IF DONE.FLAG% THEN DONE.FLAG%=0:RETURN
  430. 32014  ON MEN.CHC% GOSUB 32028,32100
  431. 32016  RETURN
  432. 32019  '
  433. 32028  '
  434. 32038  PROG.SECT$="T-bill analysis":GOSUB 40010:T.BILL.FLAG%=-1
  435. 32040  START.DEF%=34:END.DEF%=37:OFFSET%=START.DEF%-1:GOSUB 42000
  436. 32042  BUF.MAX%=END.DEF%-START.DEF%+1:PRN.MAX%=3:REPORT.DO%=0
  437. 32044  GOSUB 42500:TEST.TYP%=2:MAX.LN%=10:GOSUB 42600
  438. 32045  DAT1$=IO.BUF$(1,1):DAT2$=IO.BUF$(2,1):GOSUB 52000:P!=VAL(IO.BUF$(3,1))
  439. 32048  IF DBD%>360 THEN GOSUB 32070 ELSE GOSUB 32060
  440. 32050  IO.BUF$(4,1)=FNSTRIP$(YLD!*100)
  441. 32051  X%=FNROW%(IO.BUF$(4,4)):Y%=FNCOL%(IO.BUF$(4,4))
  442. 32053  LOCATE X%,Y%:PRINT IO.BUF$(4,3):LOCATE X%,Y%+18:PRINT IO.BUF$(4,1)
  443. 32054  T.BILL.FLAG%=0
  444. 32057  F1.MSG$="Do another analysis":ESC.MSG$="Return to previous menu":GOSUB 42750:GOSUB 44200
  445. 32059  IF ASC.RESP%=F1% THEN 32044 ELSE IF ASC.RESP%=27 THEN RETURN ELSE PRINT CHR$(7);:GOTO 32057
  446. 32060  '
  447. 32064  YLD!=((100-P!)*Y.1.LEN%)/(P!*DBD%):RETURN
  448. 32070  '
  449. 32074  A!=FNA!(DBD%,Y.1.LEN%):B!=FNB!(DBD%,Y.1.LEN%):C!=FNC!(P!):YLD!=FNQUAD!(A!,B!,C!):RETURN
  450. 32099  '
  451. 32100  '
  452. 32101  START.DEF%=38:END.DEF%=50:OFFSET%=START.DEF%-1:GOSUB 42000
  453. 32102  BUF.MAX%=END.DEF%-START.DEF%+1:PRN.MAX%=7:REPORT.DO%=0:BOND.FLAG%=-1
  454. 32104  GOSUB 42500:TEST.TYP%=2:MAX.LN%=10:GOSUB 42600
  455. 32106  GOSUB 42785
  456. 32110  DAT1$=IO.BUF$(1,1):DAT2$=IO.BUF$(2,1):GOSUB 52000:BOND.FLAG%=0
  457. 32120  YR.TO.MAT!=DBD%/365.25:P!=VAL(IO.BUF$(3,1)):FACE!=VAL(IO.BUF$(4,1))
  458. 32122  COUP!=VAL(IO.BUF$(5,1)):DAT$=IO.BUF$(6,1):GOSUB 51050:LAST.COUP%=DT.INT%
  459. 32200  TAX!=VAL(IO.BUF$(7,1)):ACCR.INT!=(DT.1%-LAST.COUP%)/365*FACE!*COUP!/100
  460. 32220  COST!=P!*FACE!/100:YR.PMT!=FACE!*COUP!/100
  461. 32230  CURR.YLD!=COUP!/P!*100:AFTER.TAX!=CURR.YLD*(100-TAX!)/100
  462. 32240  YLD!=(COUP!+((100-P!)/YR.TO.MAT!))/((100+P!)/2)
  463. 32250  IO.BUF$(8,1)=FNSTRIP$(COST!):IO.BUF$(9,1)=FNSTRIP$(ACCR.INT!)
  464. 32260  IO.BUF$(10,1)=FNSTRIP$(COST!+ACCR.INT!):IO.BUF$(11,1)=FNSTRIP$(CURR.YLD!)
  465. 32270  IO.BUF$(12,1)=FNSTRIP$(AFTER.TAX!):IO.BUF$(13,1)=FNSTRIP$(YLD!*100)
  466. 32275  GOSUB 42792
  467. 32280  FOR N%=8 TO 13
  468. 32282    X%=FNROW%(IO.BUF$(N%,4)):Y%=FNCOL%(IO.BUF$(N%,4))
  469. 32284    LOCATE X%,Y%:PRINT IO.BUF$(N%,3):LOCATE X%,Y%+18
  470. 32285   IF N%<11 THEN PRINT USING "####.##";VAL(IO.BUF$(N%,1)) ELSE PRINT USING "##.##";VAL(IO.BUF$(N%,1))
  471. 32288  NEXT
  472. 32290  F1.MSG$="Do another analysis":ESC.MSG$="Return to previous menu":GOSUB 42750:GOSUB 44200
  473. 32292  IF ASC.RESP%=F1% THEN 32104 ELSE IF ASC.RESP%=27 THEN RETURN ELSE PRINT CHR$(7);:GOTO 32290
  474. 32299  '
  475. 33000  PROG.SECT$="Days between dates":GOSUB 40010
  476. 33002  MAX.LN%=10:TEST.TYP%=2
  477. 33004  X%=7:Y%=20:LOCATE X%,Y%:PRINT "Enter first date":Y%=Y%+18:GOSUB 44000:DAT$=INP.TMP$:GOSUB 51050:IF DT.FLAG% THEN PRINT CHR$(7);:LOCATE 7,20:PRINT SPACE$(50);:DT.FLAG%=0:GOTO 33004
  478. 33005  DAT$=INP.TMP$:IF DAT$="" THEN RETURN ELSE GOSUB 51050:DT.1%=DT.INT%
  479. 33006  X%=9:Y%=20:LOCATE X%,Y%:PRINT "Enter second date":Y%=Y%+18:GOSUB 44000:DAT$=INP.TMP$:GOSUB 51050:IF DT.FLAG% THEN PRINT CHR$(7);:LOCATE 9,20:PRINT SPACE$(50);:DT.FLAG%=0:GOTO 33006
  480. 33007  DAT$=INP.TMP$:IF DAT$="" THEN RETURN ELSE GOSUB 51050:DT.2%=DT.INT%
  481. 33009  DBD%=ABS(DT.1%-DT.2%)
  482. 33010  LOCATE 12,20:PRINT "There are" DBD% "days between the two dates"
  483. 33011  LOCATE 23,1:PRINT "Press any key to return to menu";:HOOK$=INPUT$(1):RETURN
  484. 40000  '
  485. 40010  '
  486. 40015  CLS
  487. 40020  LOCATE 1,1:COLOR 15,0:PRINT PROG.NAM$;:COLOR 7,0
  488. 40025  PRINT ":"+PROG.SECT$
  489. 40030  LOCATE 4,1:PRINT STRING$(80,196)
  490. 40032  SCRATCH!=FRE("")
  491. 40035  RETURN
  492. 40100  LOCATE ,,1
  493. 40107  LONGEST$="":DONE.FLAG%=0:MEN.CHC%=0
  494. 40110  FOR N%=1 TO MAX.CHOICE%
  495. 40115    IF LEN(MENU.PROMPT$(N%))>LEN(LONGEST$) THEN LONGEST$=MENU.PROMPT$(N%)
  496. 40120  NEXT
  497. 40125  BEG.COL%=FNCT%(LONGEST$)-2
  498. 40130  FOR N%=1 TO MAX.CHOICE%
  499. 40135    LOCATE PROG.SCR%+N%,BEG.COL%:COLOR 15,0:PRINT N%;:COLOR 7,0:PRINT "- " MENU.PROMPT$(N%)
  500. 40140  NEXT 
  501. 40141  IF DOS.FLAG% THEN DONE.PR$="RETURN TO DOS" ELSE DONE.PR$="RETURN TO PREVIOUS MENU"
  502. 40142  DONE.COL%=FNCT%(DONE.PR$)-3
  503. 40143  LOCATE PROG.SCR%+N%+1,DONE.COL%:COLOR 15,0:PRINT "<ESC>";:COLOR 7,0:PRINT " "+ DONE.PR$
  504. 40145  LOCATE PROG.SCR%+N%+3,BEG.COL%:PRINT "Enter choice ";
  505. 40147  GOSUB 40190
  506. 40150  RESP$=INKEY$:IF RESP$="" THEN 40150
  507. 40151  GOSUB 40190
  508. 40152  IF RESP$=CHR$(27) THEN DONE.FLAG%=-1:RETURN
  509. 40153  LOCATE PROG.SCR%+N%+3,BEG.COL%+13:PRINT RESP$;
  510. 40154  LOCATE PROG.SCR%+N%+3,BEG.COL%+13
  511. 40155  IF NOT FNNUMBER%(RESP$) THEN PRINT CHR$(7);:GOTO 40150
  512. 40157  LOCATE PROG.SCR%+N%+3,BEG.COL%:PRINT SPACE$(30):JUNK$=INKEY$
  513. 40160  MEN.CHC%=VAL(RESP$)
  514. 40165  IF MEN.CHC%>=1 AND MEN.CHC%<=MAX.CHOICE% THEN MEN.CHC%=VAL(RESP$) ELSE PRINT CHR$(7);:GOTO 40150
  515. 40167  SCRATCH!=FRE("")
  516. 40168  X%=PROG.SCR%+1:GOSUB 40175
  517. 40170  RETURN
  518. 40174  '
  519. 40175  LOCATE ,,0:FOR X.LOC%=X% TO 23:LOCATE X.LOC%,1:PRINT SPACE$(79):NEXT:LOCATE X%,1,1:RETURN
  520. 40179  '
  521. 40190  DEF SEG=0:POKE 1050,PEEK(1052):RETURN
  522. 40199  '
  523. 40200  '
  524. 40205  LOCATE 1,60:PRINT "First entry:" START.PRN$
  525. 40210  IF LAST.DAT%<>0 THEN LOCATE 2,60:PRINT "Last entry: " LAST.PRN$
  526. 40215  IF CUR.PRN$<>"" THEN LOCATE 3,60:PRINT "Curr date:  " CUR.PRN$
  527. 40220  RETURN
  528. 40229  '
  529. 41015  CLOSE #1:FIL$=DR$+":STOCK.DAT":OPEN "I",1,FIL$
  530. 41016  IF FLNF.FLAG% THEN GOSUB 41250:FLNF.FLAG%=0
  531. 41018  RETURN
  532. 41019  '
  533. 41020  REC.LEN%=60:CLOSE:OPEN "R",1,FIL$,REC.LEN%:RETURN
  534. 41029  '
  535. 41030  FIELD #1,4 AS START.DAT$,4 AS LAST.DAT$,4 AS LAST.REC$,48 AS REST$:RETURN
  536. 41039  '
  537. 41040  FIELD #1,REC.LEN% AS RECORD$:RETURN
  538. 41049  '
  539. 41115  CLOSE #1:FIL$=DR$+":BOND.DAT":OPEN "I",1,FIL$
  540. 41116  IF FLNF.FLAG% THEN GOSUB 41250:FLNF.FLAG%=0
  541. 41118  RETURN
  542. 41119  '
  543. 41120  REC.LEN%=64:CLOSE:OPEN "R",1,FIL$,REC.LEN%:RETURN
  544. 41129  '
  545. 41130  FIELD #1,4 AS START.DAT$,4 AS LAST.DAT$,4 AS LAST.REC$,REC.LEN%-12 AS REST$:RETURN
  546. 41139  '
  547. 41140  FIELD #1,4 AS DAT.REC$,REC.LEN%-4 AS RECORD$:RETURN
  548. 41143  '
  549. 41145  CLOSE #1:FIL$=DR$+":STOX.HIS":OPEN "I",1,FIL$
  550. 41146  IF FLNF.FLAG% THEN GOSUB 41250:FLNF.FLAG%=0
  551. 41148  RETURN
  552. 41149  '
  553. 41150  REC.LEN%=160:OPEN "R",1,FIL$,REC.LEN%:RETURN
  554. 41159  '
  555. 41160  FIELD #1, 4 AS START.DAT$,4 AS LAST.DAT$,4 AS LAST.REC$,REC.LEN%-12 AS REST$:RETURN
  556. 41169  '
  557. 41170  FIELD #1, 8 AS SYMBOL$,16 AS S.NAM$,4 AS START.DAT$,4 AS LAST.DAT$,4 AS EARN$,4 AS ALPHA$,4 AS BETA$,4 AS VOLATIL$,112 AS REST$:RETURN
  558. 41179  '
  559. 41180  FIELD #1, 160 AS RECORD$:RETURN
  560. 41198  '
  561. 41199  '
  562. 41250  F1.MSG$="Try another disk":F2.MSG$="Initialize new file":ESC.MSG$="Return to main menu"
  563. 41252  GOSUB 42750:GOSUB 42775
  564. 41254  IF EDIT.BRANCH%=3 THEN RUN
  565. 41256  IF EDIT.BRANCH%=2 THEN INIT.FLAG%=-1:RETURN 
  566. 41258  LOCATE 23,40:COLOR 0,7:PRINT "Change disks and press any key to continue";:COLOR 7,0
  567. 41260  JUNK$=INPUT$(1):INIT.FLAG%=0:RETURN
  568. 41269  '
  569. 41500  CLOSE:OPEN "I",1,"STOKBOND.OVR":CLOSE:RETURN
  570. 42000  OPEN "R",2,"STOKBOND.OVR",26
  571. 42010  FIELD #2,20 AS NAM$,4 AS ROW.COL$,2 AS EOL$
  572. 42015  FOR N%=START.DEF% TO END.DEF%
  573. 42020    GET #2,N%
  574. 42025    NAM.TMP$=NAM$:ROW.COL.TMP$=ROW.COL$
  575. 42030    TR.SP$=NAM.TMP$:GOSUB 42050:IO.BUF$(N%-OFFSET%,3)=TR.SP$
  576. 42035    IO.BUF$(N%-OFFSET%,4)=ROW.COL.TMP$
  577. 42040  NEXT
  578. 42045  CLOSE #2
  579. 42046  SCRATCH!=FRE("")
  580. 42047  RETURN
  581. 42049  '
  582. 42050  '
  583. 42055  WHILE RIGHT$(TR.SP$,1)=" ":TR.SP$=LEFT$(TR.SP$,LEN(TR.SP$)-1):WEND:RETURN
  584. 42059  '
  585. 42100  '
  586. 42105  GET #1,1:START.DAT%=CVS(START.DAT$):LAST.DAT%=CVS(LAST.DAT$):LAST.REC%=CVS(LAST.REC$)
  587. 42115  DT=START.DAT%:GOSUB 51490:START.PRN$=DT.PRN$
  588. 42120  IF LAST.DAT%<>0 THEN DT=LAST.DAT%:GOSUB 51490:LAST.PRN$=DT.PRN$ 
  589. 42121  SCRATCH!=FRE("")
  590. 42122  RETURN
  591. 42199  '
  592. 42200  '
  593. 42205  LSET START.DAT$=MKS$(START.DAT%):LSET LAST.DAT$=MKS$(CUR.DAT%)
  594. 42210  LSET LAST.REC$=MKS$(LAST.REC%):LSET REST$=STRING$(REC.LEN%-12,0)
  595. 42215  PUT #1,1
  596. 42220  RETURN
  597. 42229  '
  598. 42250  '
  599. 42255  LSET SYMBOL$=IO.BUF$(1,1):LSET S.NAM$=IO.BUF$(2,1)
  600. 42257  '
  601. 42260  LSET EARN$=FNPS$(IO.BUF$(3,1)):LSET ALPHA$=FNPS$(IO.BUF$(4,1))
  602. 42262  LSET BETA$=FNPS$(IO.BUF$(5,1)):LSET VOLATIL$=FNPS$(IO.BUF$(6,1))
  603. 42264  PUT #1,REC.NUM%
  604. 42266  RETURN
  605. 42268  '
  606. 42275  '
  607. 42282  IO.BUF$(1,1)=SYMBOL$:IO.BUF$(2,1)=S.NAM$
  608. 42284  EARN.TMP$=EARN$:ALPHA.TMP$=ALPHA$:BETA.TMP$=BETA$:VOLATIL.TMP$=VOLATIL$
  609. 42286  IO.BUF$(3,1)=FNUS$(EARN.TMP$):IO.BUF$(4,1)=FNUS$(ALPHA.TMP$)
  610. 42288  IO.BUF$(5,1)=FNUS$(BETA.TMP$):IO.BUF$(6,1)=FNUS$(VOLATIL.TMP$)
  611. 42289  SCRATCH!=FRE("")
  612. 42290  RETURN
  613. 42299  '
  614. 42300  '
  615. 42305  GOSUB 50950:IF DAT$="" THEN RETURN
  616. 42310  IF DT.INT%<START.DAT% THEN ERROR 112
  617. 42315  CUR.PRN$=DAT$:CUR.DAT%=DT.INT%
  618. 42320  IF CUR.DAT%>LAST.DAT% THEN DAT.BRANCH%=2 ELSE DAT.BRANCH%=1
  619. 42325  RETURN
  620. 42349  '
  621. 42350  '
  622. 42355  GOSUB 50950:IF DAT$="" THEN RETURN
  623. 42360  IF DT.INT%>LAST.DAT% THEN ERROR 113
  624. 42362  IF DT.INT%<START.DAT% THEN ERROR 114
  625. 42364  CUR.PRN$=DAT$:CUR.DAT%=DT.INT%
  626. 42368  RETURN
  627. 42369  '
  628. 42375  GOSUB 40200:GRAF.FLAG%=-1:GOSUB 50950
  629. 42377  IF DT.INT%>LAST.DAT% THEN ERROR 123
  630. 42379  IF DT.INT%<START.DAT% THEN ERROR 124
  631. 42381  GRAF.FLAG%=0:RETURN
  632. 42399  '
  633. 42400  '
  634. 42405  MATCH.FLAG%=0:REC.NUM%=1
  635. 42410  WHILE NOT MATCH.FLAG%
  636. 42415    REC.NUM%=REC.NUM%+1:GET #1,REC.NUM%
  637. 42420    DT.TMP%=CVS(DAT.REC$):IF DT.TMP%>=CUR.DAT% THEN MATCH.FLAG%=-1
  638. 42430  WEND
  639. 42435  DT=DT.TMP%:GOSUB 51490:CUR.PRN$=DT.PRN$:CUR.DAT%=DT
  640. 42440  RETURN
  641. 42449  '
  642. 42450  STK.MAX%=0
  643. 42460  FOR REC.NUM%=2 TO 21
  644. 42462    GET #1,REC.NUM%:TR.SP$=SYMBOL$:GOSUB 42050:STK.INX$(REC.NUM%-1)=TR.SP$
  645. 42468    IF STK.INX$(REC.NUM%-1)<>STRING$(8,0) THEN STK.MAX%=REC.NUM%-1
  646. 42469  NEXT
  647. 42470  SCRATCH!=FRE(""):RETURN
  648. 42474  '
  649. 42475  '
  650. 42477  X%=PROG.SCR%+1:GOSUB 40175
  651. 42478  FOR N%=1 TO STK.MAX%
  652. 42479    X%=(N%+(N%>10)*10)+5:Y%=20-((N%>10)*30)
  653. 42481    IF STK.INX$(N%)<>STRING$(8,0) THEN LOCATE X%,Y%:COLOR 15,0:PRINT N%;:COLOR 7,0:PRINT STK.INX$(N%)
  654. 42482  NEXT
  655. 42483  RETURN
  656. 42484  '
  657. 42485  '
  658. 42486  LOCATE 23,1:PRINT CEL$;:LOCATE 23,1:PRINT "Which stock?   ";
  659. 42487  X%=23:Y%=14:TEST.TYP%=1:MAX.LN%=2:GOSUB 44000
  660. 42488  IF VAL(INP.TMP$)>STK.MAX% THEN ERROR 107
  661. 42489  STK.NUM%=VAL(INP.TMP$):RETURN
  662. 42499  '
  663. 42500  '
  664. 42505  X%=PROG.SCR%+1:GOSUB 40175
  665. 42506  FOR N%=1 TO PRN.MAX%
  666. 42510    X%=FNROW%(IO.BUF$(N%,4)):Y%=FNCOL%(IO.BUF$(N%,4))   '
  667. 42515    LOCATE X%,Y%:PRINT IO.BUF$(N%,3)
  668. 42520      IF REPORT.DO% THEN LOCATE X%,Y%+18:PRINT IO.BUF$(N%,1)
  669. 42525  NEXT
  670. 42530  SCRATCH!=FRE(""):RETURN
  671. 42539  '
  672. 42550  '
  673. 42557  X%=PROG.SCR%+1:GOSUB 40175
  674. 42558  FOR N%=1 TO ABS(STK.MAX%>10)+1
  675. 42559    Y%=((N%-1)*40)+10
  676. 42560    LOCATE 6,Y%:COLOR 15,0:PRINT "Price"+SPACE$(10)+"Volume";:COLOR 7,0
  677. 42561  NEXT
  678. 42562  FOR N%=1 TO STK.MAX%
  679. 42563   IF STK.INX$(N%)=STRING$(8,0) THEN 42570
  680. 42564    X%=(N%+(N%>10)*10)+7:Y%=((N%>10)*-40)+1
  681. 42566    LOCATE X%,Y%:PRINT STK.INX$(N%)
  682. 42568    IF REPORT.DO% THEN LOCATE X%,Y%+9:PRINT IO.BUF$(N%,1);:LOCATE X%,Y%+24:PRINT IO.BUF$(N%,2)
  683. 42570  NEXT
  684. 42575  SCRATCH!=FRE(""):RETURN
  685. 42579  '
  686. 42600  '
  687. 42604  '
  688. 42605  FOR N%=1 TO PRN.MAX%
  689. 42610    X%=FNROW%(IO.BUF$(N%,4)):Y%=FNCOL%(IO.BUF$(N%,4))+18
  690. 42615    GOSUB 44000
  691. 42617    IF T.BILL.FLAG% THEN IF N%<3 THEN 42625
  692. 42618    IF BOND.FLAG% THEN IF N%<3 OR N%=6 THEN 42625
  693. 42620    IF TEST.TYP%=2 THEN GOSUB 44750
  694. 42625    IO.BUF$(N%,1)=INP.TMP$
  695. 42630  NEXT
  696. 42635  SCRATCH!=FRE(""):RETURN
  697. 42699  '
  698. 42700  F1.MSG$="Edit":F2.MSG$="Write to disk":ESC.MSG$="Return to previous menu"
  699. 42704  GOSUB 42750
  700. 42706  RETURN
  701. 42709  '
  702. 42710  F1.MSG$="Write to disk":F2.MSG$="":ESC.MSG$="Return to menu"
  703. 42714  GOSUB 42750
  704. 42716  RETURN
  705. 42719  '
  706. 42720  F1.MSG$="Do another analysis":F2.MSG$="":ESC.MSG$="Return to menu"
  707. 42724  GOSUB 42750
  708. 42726  RETURN
  709. 42729  '
  710. 42730  F1.MSG$="Write data to file":ESC.MSG$="Return to menu"
  711. 42732  GOSUB 42750
  712. 42733  RETURN
  713. 42734  '
  714. 42740  F1.MSG$="Enter another date":ESC.MSG$="Return to previous menu"
  715. 42741  '
  716. 42742  GOSUB 42750
  717. 42743  RETURN
  718. 42745  F1.MSG$="Write data to file":ESC.MSG$="Return to main menu"
  719. 42747  GOSUB 42750
  720. 42748  RETURN
  721. 42750  '
  722. 42755  FUNC.FLAG%=0:DONE.FLAG%=0:EDIT.BRANCH%=0
  723. 42760  LOCATE 24,1:PRINT SPACE$(60);:LOCATE 24,1
  724. 42765  COLOR 0,7:PRINT "F1";:COLOR 7,0:PRINT " "+F1.MSG$+" ";
  725. 42770  IF F2.MSG$<>"" THEN COLOR 0,7:PRINT "F2";:COLOR 7,0:PRINT " "+F2.MSG$+" ";
  726. 42772  COLOR 0,7:PRINT "ESC";:COLOR 7,0:PRINT " "+ESC.MSG$+" ";
  727. 42773  RETURN
  728. 42774  '
  729. 42775  '
  730. 42776  GOSUB 44200
  731. 42777  IF ASC.RESP%=27 THEN EDIT.BRANCH%=3:RETURN
  732. 42778  IF NOT FUNC.FLAG% THEN PRINT CHR$(7);:GOTO 42776
  733. 42779  IF ASC.RESP%=F1% THEN EDIT.BRANCH%=1
  734. 42780  IF ASC.RESP%=F2% AND F2.MSG$<>"" THEN EDIT.BRANCH%=2
  735. 42781  IF EDIT.BRANCH%=0 THEN PRINT CHR$(7);:GOTO 42776
  736. 42782  LOCATE 24,1:PRINT SPACE$(79);:RETURN
  737. 42784  '
  738. 42785  LOCATE 23,60:COLOR 0,7:PRINT "Please wait";:COLOR 7,0:RETURN
  739. 42786  '
  740. 42792  LOCATE 23,60:PRINT SPACE$(19);:RETURN
  741. 42793  '
  742. 42795  GOSUB 42792:LOCATE 23,1:PRINT SPACE$(50):LOCATE 23,1:PRINT "Are you sure (y/n)?"
  743. 42796  TEST.TYP%=3:MAX.LN%=1:X%=23:Y%=22:GOSUB 44000
  744. 42797  IF INP.TMP$="Y" OR INP.TMP$="y" THEN CONFIRM.FLAG%=-1 ELSE CONFIRM.FLAG%=0
  745. 42798  RETURN
  746. 42799  '
  747. 42800  '
  748. 42805  FOR REC%=1 TO PRN.MAX%
  749. 42810    TST.TMP$=FNUS$(FNEXTRACT$(REC.BUF$,REC%))
  750. 42811      IF STK.MOD% THEN IF REC%<8 THEN INT.FLAG%=0 ELSE INT.FLAG%=-1
  751. 42812      IF BOND.MOD% THEN IF REC%<15 THEN INT.FLAG%=0 ELSE INT.FLAG%=-1
  752. 42813    GOSUB 42990:IO.BUF$(REC%,1)=TST.TMP$
  753. 42815  NEXT
  754. 42817  SCRATCH!=FRE(""):RETURN
  755. 42849  '
  756. 42850  '
  757. 42855  GOSUB 42785:RECORD.TMP$=""
  758. 42860  FOR N%=1 TO PRN.MAX%
  759. 42865    RECORD.TMP$=RECORD.TMP$+FNPS$(IO.BUF$(N%,1))
  760. 42870  NEXT
  761. 42871  LSET RECORD$=RECORD.TMP$
  762. 42872    IF BOND.MOD% THEN LSET DAT.REC$=MKS$(CUR.DAT%)
  763. 42873  PUT#1,REC.NUM%
  764. 42875  SCRATCH!=FRE(""):GOSUB 42792:RETURN
  765. 42879  '
  766. 42880  '
  767. 42881  REC.NUM%=REC.NUM.START%
  768. 42882  WHILE FILL.COUNT%>0
  769. 42883    GET #1,REC.NUM%:REC.BUF$=RECORD$
  770. 42884    IF LEFT$(REC.BUF$,4)<>STRING$(4,0) THEN WHOLE.REC.BUF$(FILL.COUNT%)=REC.BUF$:FILL.COUNT%=FILL.COUNT%-1
  771. 42886    REC.NUM%=REC.NUM%-1
  772. 42887  WEND
  773. 42888  FILL.COUNT%=10:RETURN
  774. 42889  '
  775. 42899  '
  776. 42900  '
  777. 42905  FOR REC%=LAST.REC%+1 TO REC.NUM%
  778. 42910    LSET RECORD$=STRING$(REC.LEN%,0)
  779. 42915    PUT#1,REC%
  780. 42920  NEXT
  781. 42925  RETURN
  782. 42949  '
  783. 42950  '
  784. 42952  FOR REC%=1 TO STK.MAX%
  785. 42954    REC.TMP$=FNSTK.EXTRACT$(REC.BUF$,REC%)
  786. 42956    TST.TMP$=FNUS$(LEFT$(REC.TMP$,4)):INT.FLAG%=0:GOSUB 42990:IO.BUF$(REC%,1)=TST.TMP$
  787. 42957    TST.TMP$=FNUS$(RIGHT$(REC.TMP$,4)):INT.FLAG%=-1:GOSUB 42990:IO.BUF$(REC%,2)=TST.TMP$
  788. 42960  NEXT
  789. 42968  RETURN
  790. 42969  '
  791. 42975  '
  792. 42976  GOSUB 42785:RECORD.TMP$=""
  793. 42977  FOR REC%=1 TO STK.MAX%
  794. 42978    RECORD.TMP$=RECORD.TMP$+FNPS$(IO.BUF$(REC%,1))+FNPS$(IO.BUF$(REC%,2))
  795. 42979  NEXT
  796. 42980  RECORD.TMP$=RECORD.TMP$+STRING$((20-STK.MAX%)*8,0)
  797. 42981  LSET RECORD$=RECORD.TMP$:PUT #1,REC.NUM%
  798. 42982  SCRATCH!=FRE(""):GOSUB 42792:RETURN
  799. 42989  '
  800. 42990  TST.TMP#=VAL(TST.TMP$)
  801. 42991  IF TST.TMP#>3750 OR INT.FLAG% THEN 42996
  802. 42992    TST.TMP#=INT((TST.TMP#*100)+0.56)/100
  803. 42993    TST.TMP$=STR$(TST.TMP#)
  804. 42994    BRK.POS%=INSTR(TST.TMP$,".")
  805. 42995      IF BRK.POS% THEN GOSUB 42998 ELSE TST.TMP$=TST.TMP$+".00"
  806. 42996  IF LEN(TST.TMP$)>8 THEN TST.TMP$=LEFT$(TST.TMP$,8) ELSE TST.TMP$=SPACE$(8-LEN(TST.TMP$))+TST.TMP$:RETURN
  807. 42997  '
  808. 42998  IF LEN(TST.TMP$)-BRK.POS%=1 THEN TST.TMP$=TST.TMP$+"0"
  809. 42999  RETURN
  810. 43000  '
  811. 43001  '
  812. 43002  '
  813. 43020  '
  814. 43030  '
  815. 43035  ER.N%=101:GOSUB 42710
  816. 43040  ROW%=1:COL%=1:GOSUB 43260
  817. 43050  GOSUB 44200
  818. 43070  IF FUNC.FLAG% THEN IF FNARROW%(ASC.RESP%) THEN GOSUB 43130:GOSUB 43260:GOTO 43050
  819. 43072  IF FUNC.FLAG% THEN IF ASC.RESP%=F1% THEN GOSUB 42850:RETURN 
  820. 43075  IF ASC.RESP%=27 THEN RETURN
  821. 43080  IF FUNC.FLAG% OR ASC.RESP%<45 OR ASC.RESP%>122 THEN ERROR 101
  822. 43085  LEAD.IN$=RESP$:GOSUB 44000
  823. 43090  LOCATE X%,Y%
  824. 43095  IF SWAP.FLAG% THEN GOSUB 44750:IO.BUF$(FLD.NUM%,1)=INP.TMP$
  825. 43100  GOTO 43050
  826. 43120  '
  827. 43130  '
  828. 43160  IF ASC.RESP%=UP.ARROW% THEN ROW%=ROW%-1
  829. 43170  IF ASC.RESP%=DOWN.ARROW% THEN ROW%=ROW%+1
  830. 43180  IF ASC.RESP%=LFT.ARROW% THEN COL%=COL%-1
  831. 43190  IF ASC.RESP%=RT.ARROW% THEN COL%=COL%+1
  832. 43195  GOSUB 43250:GOSUB 43260
  833. 43240  IF BLANK.FLAG% THEN COL%=COL%+1:GOSUB 43250:GOSUB 43260
  834. 43245  RETURN
  835. 43249  '
  836. 43250  '
  837. 43251  IF COL%>MAX.COL% THEN ROW%=ROW%+1:COL%=1
  838. 43253  IF COL%=0 THEN ROW%=ROW%-1:COL%=MAX.COL%
  839. 43255  IF ROW%>MAX.ROW% THEN ROW%=1
  840. 43257  IF ROW%=0 THEN ROW%=MAX.ROW%
  841. 43258  RETURN
  842. 43259  '
  843. 43260  '
  844. 43275  BLANK.FLAG%=0:FLD.NUM%=VAL(FLD.PTR$(ROW%,COL%,MOD.TYP%))
  845. 43285  IF FLD.NUM%=0 THEN BLANK.FLAG%=-1:RETURN
  846. 43290  X%=VAL(LEFT$(IO.BUF$(FLD.NUM%,4),2))+PROG.SCR%:Y%=VAL(RIGHT$(IO.BUF$(FLD.NUM%,4),2))+18
  847. 43310  LOCATE X%,Y%
  848. 43320  RETURN
  849. 43330  '
  850. 43500  '
  851. 43510  ER.N%=102:GOSUB 42710
  852. 43540  FLD.NUM%=1:GOSUB 43675
  853. 43550  GOSUB 44200
  854. 43560  IF ASC.RESP%=27 THEN RETURN
  855. 43570  IF FUNC.FLAG% THEN IF FNARROW%(ASC.RESP%) THEN GOSUB 43630:GOSUB 43675:GOTO 43550
  856. 43572  IF FUNC.FLAG% THEN IF ASC.RESP%=F1% THEN WRITE.FLAG%=-1:RETURN
  857. 43580  IF FUNC.FLAG% OR ASC.RESP%<45 OR ASC.RESP%>122 THEN ERROR 102
  858. 43585  LEAD.IN$=RESP$:GOSUB 44000
  859. 43590  LOCATE X%,Y%
  860. 43595  IF SWAP.FLAG% THEN GOSUB 44750:IO.BUF$(FLD.NUM%,1)=INP.TMP$:GOSUB 43630:GOSUB 43675
  861. 43600  GOTO 43550
  862. 43620  '
  863. 43630  '
  864. 43660  IF ASC.RESP%=DOWN.ARROW% OR ASC.RESP%=RT.ARROW% THEN FLD.NUM%=FLD.NUM%+1
  865. 43662  IF ASC.RESP%=UP.ARROW% OR ASC.RESP%=LFT.ARROW% THEN FLD.NUM%=FLD.NUM%-1
  866. 43664  IF FLD.NUM%>BUF.MAX% THEN FLD.NUM%=1
  867. 43665  IF FLD.NUM%=0 THEN FLD.NUM%=BUF.MAX%
  868. 43666  FUNC.FLAG%=0:RETURN
  869. 43669  '
  870. 43675  '
  871. 43680  X%=VAL(LEFT$(IO.BUF$(FLD.NUM%,4),2))+PROG.SCR%
  872. 43682  Y%=VAL(RIGHT$(IO.BUF$(FLD.NUM%,4),2))+18
  873. 43683  LOCATE X%,Y%
  874. 43684  RETURN
  875. 43689  '
  876. 43750  '
  877. 43752  ER.N%=103:GOSUB 42710
  878. 43755  FLD.NUM%=1:COL%=1:GOSUB 43875
  879. 43760  ERR.FLAG%=0:GOSUB 44200
  880. 43761  IF ASC.RESP%=27 THEN RETURN
  881. 43765  IF FUNC.FLAG% THEN IF FNARROW%(ASC.RESP%) THEN GOSUB 43830:GOSUB 43875:GOTO 43760
  882. 43770  IF FUNC.FLAG% THEN IF ASC.RESP%=F1% THEN GOSUB 42975::RETURN
  883. 43775  IF ASC.RESP%=27 THEN RETURN
  884. 43780  IF FUNC.FLAG% OR ASC.RESP%<45 OR ASC.RESP%>122 THEN ERROR 103
  885. 43785  LEAD.IN$=RESP$:GOSUB 44000
  886. 43790  LOCATE X%,Y%
  887. 43795  IF SWAP.FLAG% THEN GOSUB 44750:IO.BUF$(FLD.NUM%,COL%)=INP.TMP$
  888. 43800  GOTO 43760
  889. 43810  '
  890. 43830  '
  891. 43860  IF ASC.RESP%=DOWN.ARROW% THEN FLD.NUM%=FLD.NUM%+1
  892. 43861  IF ASC.RESP%=UP.ARROW% THEN FLD.NUM%=FLD.NUM%-1
  893. 43862  IF ASC.RESP%=LFT.ARROW% THEN COL%=COL%-1
  894. 43863  IF ASC.RESP%=RT.ARROW% THEN COL%=COL%+1
  895. 43864  IF COL%>2 THEN FLD.NUM%=FLD.NUM%+1:COL%=1
  896. 43865  IF COL%<1 THEN FLD.NUM%=FLD.NUM%-1:COL%=2
  897. 43866  IF FLD.NUM%=0 THEN FLD.NUM%=STK.MAX%
  898. 43867  IF FLD.NUM%>STK.MAX% THEN FLD.NUM%=1
  899. 43868  RETURN
  900. 43869  '
  901. 43875  '
  902. 43876  IF STK.INX$(FLD.NUM%)=STRING$(8,0) THEN GOSUB 43890:GOTO 43876
  903. 43880  IF FLD.NUM%<11 THEN X%=FLD.NUM% ELSE X%=FLD.NUM%-10
  904. 43881  X%=X%+PROG.SCR%+2:Y%=((FLD.NUM%>10)*-40)+((COL%-1)*15)+10
  905. 43883  LOCATE X%,Y%
  906. 43884  RETURN
  907. 43885  '
  908. 43890  IF ASC.RESP%=RT.ARROW% OR ASC.RESP%=DOWN.ARROW% THEN ASC.RESP%=DOWN.ARROW%:GOSUB 43830:RETURN
  909. 43891  IF ASC.RESP%=UP.ARROW% OR ASC.RESP%=LFT.ARROW% THEN ASC.RESP%=UP.ARROW%:GOSUB 43830:RETURN
  910. 43892  '
  911. 44000  '
  912. 44060  GOSUB 40190:FUNC.FLAG%=0:SWAP.FLAG%=0:INP.TMP$="":RESP.CUM$="":X.PRN%=X%:Y.PRN%=Y%
  913. 44080  LOCATE X.PRN%,Y.PRN%
  914. 44090  IF LEAD.IN$<>"" THEN GOSUB 44190:IF ERR.FLAG% THEN ERROR ER.N% ELSE 44120
  915. 44100  GOSUB 44200
  916. 44102    IF ASC.RESP%=27 THEN GOSUB 44470:RETURN
  917. 44104    IF ASC.RESP%=13 THEN GOSUB 44510:RETURN
  918. 44106    IF ASC.RESP%=8 OR ASC.RESP%=127 THEN GOSUB 44400:GOTO 44100
  919. 44108  IF LEN(RESP.CUM$)=MAX.LN% THEN ERROR 105
  920. 44110  ERR.FLAG%=0:ON TEST.TYP% GOSUB 44220,44230,44240
  921. 44115  IF ERR.FLAG% THEN ERROR 105
  922. 44120  GOSUB 44320:GOTO 44100
  923. 44150  '
  924. 44190  '
  925. 44191  '
  926. 44192  RESP$=LEAD.IN$:LEAD.IN$=""
  927. 44194  ON TEST.TYP% GOSUB 44220,44230,44240
  928. 44195  IF NOT ERR.FLAG% THEN PRINT SPACE$(MAX.LN%):LOCATE X%,Y%
  929. 44196  RETURN
  930. 44199  '
  931. 44200  '
  932. 44201  RESP$=INKEY$:IF RESP$="" THEN 44201
  933. 44202  IF LEN(RESP$)>1 THEN FUNC.FLAG%=-1:RESP$=RIGHT$(RESP$,1):GOTO 44204
  934. 44203  IF LEN(RESP$)=1 THEN FUNC.FLAG%=0
  935. 44204  ASC.RESP%=ASC(RESP$)
  936. 44205  ERR.FLAG%=0:RETURN
  937. 44219  '
  938. 44220  IF FUNC.FLAG% THEN ERR.FLAG%=-1:RETURN
  939. 44223  IF NOT FNNUMBER%(RESP$) THEN ERR.FLAG%=-1
  940. 44224  RETURN
  941. 44229  '
  942. 44230  IF FUNC.FLAG% THEN ERR.FLAG%=-1:RETURN
  943. 44233  IF NOT FNNUMOP%(RESP$) THEN ERR.FLAG%=-1:
  944. 44234  RETURN
  945. 44239  '
  946. 44240  IF FUNC.FLAG% THEN ERR.FLAG%=-1:RETURN
  947. 44243  IF ASC.RESP%<31 OR ASC.RESP%>126 THEN ERR.FLAG%=-1:RETURN
  948. 44244  IF CAP.FLAG% AND FNLETTER%(RESP$) THEN RESP$=FNFOLD$(RESP$)
  949. 44246  RETURN
  950. 44249  '
  951. 44320  RESP.CUM$=RESP.CUM$+RESP$:LOCATE X.PRN%,Y.PRN%:PRINT RESP$;:Y.PRN%=Y.PRN%+1:RETURN
  952. 44399  '
  953. 44400  IF Y.PRN%=Y% THEN ERROR 105
  954. 44410  RESP.CUM$=LEFT$(RESP.CUM$,LEN(RESP.CUM$)-1):LOCATE X.PRN%,Y.PRN%:PRINT BS$;:Y.PRN%=Y.PRN%-1
  955. 44460  RETURN
  956. 44470  '
  957. 44480  LOCATE X%,Y%:PRINT SPACE$(LEN(RESP.CUM$)):LOCATE X%,Y%
  958. 44490  RESP.CUM$="":LEAD.IN$="":SWAP.FLAG%=0:Y.PRN%=Y%
  959. 44500  RETURN
  960. 44510  '
  961. 44520  INP.TMP$=RESP.CUM$:SWAP.FLAG%=-1:RESP$="":RETURN
  962. 44750  '
  963. 44752  BRK.1%=0:BRK.2%=0:ERR.FLAG%=0
  964. 44756  IF INSTR(INP.TMP$,"/") THEN GOSUB 44762 ELSE IF INSTR(INP.TMP$,"'") THEN GOSUB 44782 ELSE GOSUB 44802
  965. 44757  INP.TMP$=STR$(P!)
  966. 44758  RETURN
  967. 44760  '
  968. 44762  BRK.1%=INSTR(INP.TMP$," ")
  969. 44766  IF BRK.1%=0 THEN PR.1$="0":PR.2$=INP.TMP$:GOTO 44770
  970. 44768  GOSUB 44794
  971. 44770  BRK.2%=INSTR(PR.2$,"/")
  972. 44772  NUMER$=LEFT$(PR.2$,BRK.2%-1):DENOM$=RIGHT$(PR.2$,LEN(PR.2$)-BRK.2%)
  973. 44774  IF VAL(DENOM$)=0 THEN ERROR 116
  974. 44776  PR.2!=VAL(NUMER$)/VAL(DENOM$):PR.1!=VAL(PR.1$):P!=PR.1!+PR.2!
  975. 44778  RETURN
  976. 44780  '
  977. 44782  BRK.1%=INSTR(INP.TMP$,"'"):PR.1!=VAL(PR.1$):PR.2!=VAL(PR.2$)/32:P!=PR.1!+PR.2!:RETURN
  978. 44792  '
  979. 44794  PR.1$=LEFT$(INP.TMP$,BRK.1%-1):PR.2$=RIGHT$(INP.TMP$,LEN(INP.TMP$)-BRK.1%)
  980. 44800  RETURN
  981. 44802  '
  982. 44804  P!=VAL(INP.TMP$):RETURN
  983. 44999  '
  984. 45000  '
  985. 45012  X%=PROG.SCR%+1:GOSUB 40175
  986. 45020  FOR N%=1 TO BUF.MAX%
  987. 45024    BUF.MAX.SPLIT%=INT((BUF.MAX%+1)/2)
  988. 45028    X%=(N%+(N%>BUF.MAX.SPLIT%)*BUF.MAX.SPLIT%)+5:Y%=20-((N%>BUF.MAX.SPLIT%)*25)            '
  989. 45032    LOCATE X%,Y%:COLOR 15,0:PRINT N%;:COLOR 7,0:PRINT IO.BUF$(N%,3)
  990. 45036  NEXT
  991. 45040  RETURN
  992. 45041  '
  993. 45044  '
  994. 45048  '
  995. 45052  LOCATE 23,1:PRINT SPACE$(79)
  996. 45056  LOCATE 23,1:PRINT "Which value "+PROMPT.TAG$;
  997. 45060  X%=23:Y%=13+LEN(PROMPT.TAG$):MAX.LN%=2:TEST.TYP%=1:GOSUB 44000
  998. 45064  VAL.PTR%=VAL(INP.TMP$)
  999. 45068  RETURN
  1000. 45072  '
  1001. 45076  '
  1002. 45080  LOCATE 23,1:PRINT SPACE$(40)
  1003. 45082  IF BOND.MOD% THEN MA.UNIT$="weeks" ELSE MA.UNIT$="days"
  1004. 45084  LOCATE 23,1:PRINT "Enter term ("+MA.UNIT$+")";
  1005. 45088  X%=23:Y%=20:TEST.TYP%=1:MAX.LN%=3:GOSUB 44000
  1006. 45092  TERM!=VAL(INP.TMP$)
  1007. 45096  RETURN
  1008. 45100  '
  1009. 45101  '
  1010. 45104  '
  1011. 45106  FILL.COUNT%=1:REC.NUM%=START.REC%:OUT.OF.DTA%=0:MAX.POINTS%=75
  1012. 45108  WHILE FILL.COUNT%<=MAX.POINTS% AND NOT OUT.OF.DTA%
  1013. 45110    IF REC.NUM%=LAST.REC% THEN OUT.OF.DTA%=-1
  1014. 45112    GET #1,REC.NUM%:REC.TMP$=RECORD$
  1015. 45114    IF LEFT$(REC.TMP$,4)=STRING$(4,0) OR LEFT$(REC.TMP$,4)=MKS$(32767) THEN 45121
  1016. 45116      IF STK.HIS% THEN GOSUB 45136 ELSE GOSUB 45128
  1017. 45120      FILL.COUNT%=FILL.COUNT%+1
  1018. 45121    REC.NUM%=REC.NUM%+1
  1019. 45122  WEND
  1020. 45125  MAX.POINTS%=FILL.COUNT%-1
  1021. 45126  RETURN
  1022. 45127  '
  1023. 45128  IF STK.MOD% THEN IF VAL.PTR%=16 THEN VAL.BUF!(FILL.COUNT%+TERM!-1,BUF.LOC%)=FNTRIN!(REC.TMP$):GOTO 45132
  1024. 45129  IF STK.MOD% THEN IF VAL.PTR%=17 THEN VAL.BUF!(FILL.COUNT%+TERM!-1,BUF.LOC%)=FNAD!(REC.TMP$):GOTO 45132
  1025. 45130  VAL.BUF!(FILL.COUNT%+TERM!-1,BUF.LOC%)=CVS(FNEXTRACT$(REC.TMP$,VAL.PTR%))
  1026. 45132  IF STK.MOD% THEN VAL.BUF!(FILL.COUNT%+TERM!-1,4)=(REC.NUM%+START.DAT%-2)
  1027. 45133  IF BOND.MOD% THEN VAL.BUF!(FILL.COUNT%+TERM!-1,4)=CVS(DAT.REC$)
  1028. 45134  RETURN
  1029. 45135  '
  1030. 45136  REC.TMP$=FNSTK.EXTRACT$(REC.TMP$,STK.NUM%)
  1031. 45137  VAL.BUF!(FILL.COUNT%+TERM!-1,1)=CVS(LEFT$(REC.TMP$,4))
  1032. 45138  VAL.BUF!(FILL.COUNT%+TERM!-1,3)=CVS(RIGHT$(REC.TMP$,4))
  1033. 45139  VAL.BUF!(FILL.COUNT%+TERM!-1,4)=(REC.NUM%+START.DAT%-22)
  1034. 45140  RETURN
  1035. 45141  '
  1036. 45144  '
  1037. 45146  FILL.COUNT%=1:REC.NUM%=START.REC%-1:OUT.OF.DTA%=0
  1038. 45147  WHILE FILL.COUNT%<=TERM!-1 AND NOT OUT.OF.DTA%
  1039. 45148    IF REC.NUM%=2 THEN OUT.OF.DTA%=-1
  1040. 45149    GET #1,REC.NUM%:REC.TMP$=RECORD$
  1041. 45150    IF LEFT$(REC.TMP$,4)=STRING$(4,0) OR LEFT$(REC.TMP$,4)=MKS$(32767) THEN 45153
  1042. 45151    IF STK.HIS% THEN GOSUB 45170 ELSE GOSUB 45160
  1043. 45152    FILL.COUNT%=FILL.COUNT%+1
  1044. 45153    REC.NUM%=REC.NUM%-1
  1045. 45155  WEND
  1046. 45156  IF OUT.OF.DTA% AND FILL.COUNT%<TERM!-1 THEN ERROR 125
  1047. 45157  RETURN
  1048. 45159  '
  1049. 45160  IF VAL.PTR%=16 THEN VAL.BUF!(TERM!-FILL.COUNT%,BUF.LOC%)=FNTRIN!(REC.TMP$):RETURN
  1050. 45163  IF VAL.PTR%=17 THEN VAL.BUF!(TERM!-FILL.COUNT%,BUF.LOC%)=FNAD!(REC.TMP$):RETURN
  1051. 45166  VAL.BUF!(TERM!-FILL.COUNT%,BUF.LOC%)=CVS(FNEXTRACT$(REC.TMP$,VAL.PTR%))
  1052. 45167  RETURN
  1053. 45169  '
  1054. 45170  REC.TMP$=FNSTK.EXTRACT$(REC.TMP$,STK.NUM%)
  1055. 45171  VAL.BUF!(TERM!-FILL.COUNT%,1)=CVS(LEFT$(REC.TMP$,4))
  1056. 45172  PRINT VAL.BUF!(TERM!-FILL.COUNT%,1)
  1057. 45174  RETURN
  1058. 45179  '
  1059. 45184  SUM!=0
  1060. 45192  FOR REC.NUM%=1 TO TERM!
  1061. 45196    SUM!=SUM!+VAL.BUF!(REC.NUM%,BUF.LOC%)
  1062. 45200  NEXT
  1063. 45204  VAL.BUF!(TERM!,2)=(SUM!/TERM!)
  1064. 45208  FOR REC.NUM%=TERM!+1 TO MAX.POINTS%+TERM!
  1065. 45212    DROP.OFF!=VAL.BUF!(REC.NUM%-TERM!,BUF.LOC%):SUM!=SUM!-DROP.OFF!
  1066. 45216    SUM!=SUM!+(VAL.BUF!(REC.NUM%-1,BUF.LOC%)):VAL.BUF!(REC.NUM%,2)=(SUM!/TERM!)
  1067. 45220  NEXT
  1068. 45224  RETURN
  1069. 45228  '
  1070. 45232  '
  1071. 45236  FOR REC.NUM%=MAX.POINTS%+TERM! TO TERM! STEP -1
  1072. 45240    CURR!=VAL.BUF!(REC.NUM%,BUF.LOC%):PREV!=VAL.BUF!(REC.NUM%-TERM!+1,BUF.LOC%)
  1073. 45244    VAL.BUF!(REC.NUM%,BUF.LOC%)=(FNPC!(PREV!,CURR!))
  1074. 45248  NEXT
  1075. 45252  RETURN
  1076. 45256  '
  1077. 45999  '
  1078. 46000  IF STK.HIS% THEN GOSUB 46003 ELSE GOSUB 46010
  1079. 46001  GOSUB 42730:GOSUB 42775:IF EDIT.BRANCH%=1 THEN GOSUB 49500
  1080. 46002  RETURN
  1081. 46003  GOSUB 41180:GOSUB 42475:GOSUB 42485:LABEL.1$=STK.INX$(STK.NUM%):BUF.LOC%=1
  1082. 46005  PRINT SPACE$(79);:GOSUB 45076:GOSUB 42785:GOSUB 45104:GOSUB 45144:GOSUB 45184
  1083. 46006  GOSUB 46048
  1084. 46008  RETURN
  1085. 46009  '
  1086. 46010  GOSUB 45012:PROMPT.TAG$="":BUF.LOC%=1:GOSUB 45044:LABEL.1$=IO.BUF$(VAL.PTR%,3)
  1087. 46011  GOSUB 45076:GOSUB 42785:GOSUB 45104:GOSUB 45144:GOSUB 45184
  1088. 46012  IF STK.MOD% THEN VAL.PTR%=11:BUF.LOC%=3:GOSUB 45104
  1089. 46013  GOSUB 46048:RETURN
  1090. 46014  '
  1091. 46016  '
  1092. 46018  GOSUB 45012
  1093. 46019  IF NOT STK.HIS% THEN LOCATE 17,30:COLOR 15,0:PRINT "20";:COLOR 7,0:PRINT " Define your own indicator"
  1094. 46020  PROMPT.TAG$="":BUF.LOC%=1:GOSUB 45044
  1095. 46021  IF VAL.PTR%=20 THEN GOSUB 47036 ELSE IF VAL.PTR%>BUF.MAX% OR VAL.PTR%=0 THEN 46018
  1096. 46022  LABEL.1$=IO.BUF$(VAL.PTR%,3)
  1097. 46023  GOSUB 45076:GOSUB 42785:GOSUB 45104:GOSUB 45144:GOSUB 45184
  1098. 46024  GOSUB 46104
  1099. 46025  GOSUB 42730:GOSUB 42775:IF EDIT.BRANCH%=1 THEN GOSUB 49500
  1100. 46026  RETURN
  1101. 46028  '
  1102. 46030  '
  1103. 46032  TERM!=1:GOSUB 45012
  1104. 46034  PROMPT.TAG$="for 1st indicator ":GOSUB 45044
  1105. 46036  GOSUB 42785:BUF.LOC%=1:GOSUB 45104:LABEL.1$=IO.BUF$(VAL.PTR%,3)
  1106. 46038  GOSUB 42792:PROMPT.TAG$="for 2nd indicator ":GOSUB 45044
  1107. 46040  GOSUB 42785:BUF.LOC%=3:GOSUB 45104:LABEL.2$=IO.BUF$(VAL.PTR%,3)
  1108. 46042  GOSUB 46136
  1109. 46043  GOSUB 42730:GOSUB 42775:IF EDIT.BRANCH%=1 THEN GOSUB 49500
  1110. 46044  RETURN
  1111. 46046  '
  1112. 46048  '
  1113. 46050  '
  1114. 46052  MIN!=VAL.BUF!(TERM!,1):MAX!=VAL.BUF!(TERM!,1)
  1115. 46054  TEST.FEELD%=1:GOSUB 46500      
  1116. 46056  TEST.FEELD%=2:GOSUB 46500 
  1117. 46057  MIN.1!=MIN!:MAX.1!=MAX!
  1118. 46058  V.POINTS!=15:X.OFF!=5:HIST.FLAG%=0:Y.PT%=6
  1119. 46060  CLS:LOCATE ,,0
  1120. 46062  GOSUB 46500
  1121. 46064  FOR N%=TERM! TO MAX.POINTS%+TERM!-1
  1122. 46066    VAL.IND!=VAL.BUF!(N%,1):PLOT.CHAR%=43
  1123. 46068    GOSUB 46518:GOSUB 46532
  1124. 46070    VAL.IND!=VAL.BUF!(N%,2):PLOT.CHAR%=45
  1125. 46072    GOSUB 46518:GOSUB 46532
  1126. 46074    Y.PT%=Y.PT%+1
  1127. 46076  NEXT
  1128. 46078  '
  1129. 46080  '
  1130. 46082  BUF.LOC%=3:TEST.FEELD%=BUF.LOC%
  1131. 46084  MIN!=VAL.BUF!(TERM!,3):MAX!=VAL.BUF!(TERM!,3)
  1132. 46086  V.POINTS!=5:X.OFF!=0:HIST.FLAG%=-1:Y.PT%=6
  1133. 46088  GOSUB 46500
  1134. 46090  FOR N%=TERM! TO MAX.POINTS%+TERM!-1
  1135. 46092    VAL.IND!=VAL.BUF!(N%,BUF.LOC%):PLOT.CHAR%=124
  1136. 46094    GOSUB 46518:GOSUB 46532
  1137. 46096    Y.PT%=Y.PT%+1
  1138. 46098  NEXT
  1139. 46100  GOSUB 46201:RETURN
  1140. 46102  '
  1141. 46104  '
  1142. 46106  MIN!=VAL.BUF!(TERM!,1):MAX!=VAL.BUF!(TERM!,1)
  1143. 46108  TEST.FEELD%=1:GOSUB 46500:TEST.FEELD%=2:GOSUB 46500:MIN.1!=MIN!:MAX.1!=MAX!
  1144. 46112  V.POINTS!=20:X.OFF!=0:HIST.FLAG%=0:Y.PT%=6:CLS:LOCATE ,,0
  1145. 46116  GOSUB 46500
  1146. 46118  FOR N%=TERM! TO MAX.POINTS%+TERM!-1
  1147. 46120    VAL.IND!=VAL.BUF!(N%,1):PLOT.CHAR%=43:GOSUB 46518:GOSUB 46532
  1148. 46124    VAL.IND!=VAL.BUF!(N%,2):PLOT.CHAR%=45:GOSUB 46518:GOSUB 46532
  1149. 46128  Y.PT%=Y.PT%+1
  1150. 46130  NEXT
  1151. 46132  GOSUB 46300:RETURN
  1152. 46135  '
  1153. 46136  '
  1154. 46138  MIN!=VAL.BUF!(TERM!,1):MAX!=VAL.BUF!(TERM!,1)
  1155. 46140  TEST.FEELD%=1:GOSUB 46500:MIN.1!=MIN!:MAX.1!=MAX!
  1156. 46142  V.POINTS!=9:X.OFF!=11:HIST.FLAG%=0:Y.PT%=6:CLS:LOCATE ,,0
  1157. 46146  GOSUB 46500
  1158. 46148  FOR N%=TERM! TO MAX.POINTS%+TERM!-1
  1159. 46150    VAL.IND!=VAL.BUF!(N%,1):PLOT.CHAR%=43:GOSUB 46518:GOSUB 46532:Y.PT%=Y.PT%+1
  1160. 46156  NEXT
  1161. 46158  '
  1162. 46160  MIN!=VAL.BUF!(TERM!,3):MAX!=VAL.BUF!(TERM!,3):TEST.FEELD%=3:GOSUB 46500      '
  1163. 46163  MIN.2!=MIN!:MAX.2!=MAX!:V.POINTS!=9:X.OFF!=1:HIST.FLAG%=0:Y.PT%=6:GOSUB 46500 
  1164. 46168  FOR N%=TERM! TO MAX.POINTS%+TERM!-1
  1165. 46170    VAL.IND!=VAL.BUF!(N%,3):PLOT.CHAR%=45
  1166. 46172    GOSUB 46518:GOSUB 46532:Y.PT%=Y.PT%+1
  1167. 46176  NEXT
  1168. 46177  GOSUB 46400:RETURN
  1169. 46180  '
  1170. 46200  '
  1171. 46201  AXIS%=21:GOSUB 46460:LOCATE AXIS%,5:PRINT CHR$(L.L.CORNER%);
  1172. 46216  LOCATE AXIS%,6:PRINT STRING$(75,HOR.LIN%);:GOSUB 46468
  1173. 46228  LAB.VAL!=MAX.1!:X%=1:GOSUB 46488:LAB.VAL!=MIN.1!:X%=15:GOSUB 46488
  1174. 46236  LOCATE 23,5:PRINT LABEL.1$;:PRINT "; moving avg term" TERM! MA.UNIT$
  1175. 46240  RETURN
  1176. 46244  '
  1177. 46300  AXIS%=21:GOSUB 46460:LOCATE AXIS%,5:PRINT CHR$(L.L.CORNER%);
  1178. 46316  LOCATE AXIS%,6:PRINT STRING$(75,HOR.LIN%);:GOSUB 46468
  1179. 46328  LAB.VAL!=MAX!:X%=1:GOSUB 46488:LAB.VAL!=MIN!:X%=AXIS%:GOSUB 46488
  1180. 46336  LOCATE 23,5:PRINT LABEL.1$;:PRINT "; moving avg term" TERM! MA.UNIT$
  1181. 46340  RETURN
  1182. 46344  '
  1183. 46400  AXIS%=20:GOSUB 46460:LOCATE 10,5:PRINT CHR$(JOINT%):LOCATE 10,6:PRINT STRING$(74,HOR.LIN%)
  1184. 46420  LOCATE AXIS%,5:PRINT CHR$(L.L.CORNER%);:LOCATE AXIS%,6:PRINT STRING$(74,HOR.LIN%);
  1185. 46432  GOSUB 46468
  1186. 46436  LAB.VAL!=MAX.1!:X%=1:GOSUB 46488:LAB.VAL!=MIN.1!:X%=9:GOSUB 46488
  1187. 46440  LAB.VAL!=MAX.2!:X%=11:GOSUB 46488:LAB.VAL!=MIN.2!:X%=20:GOSUB 46488
  1188. 46448  LOCATE 23,5:PRINT LABEL.1$ " (top) & " LABEL.2$ " (bottom)"
  1189. 46452  RETURN
  1190. 46456  '
  1191. 46460  FOR N%=1 TO AXIS%:LOCATE N%,5:PRINT CHR$(VER.LIN%);:NEXT:RETURN
  1192. 46464  '
  1193. 46468  FOR N%=6 TO MAX.POINTS%
  1194. 46470    IF (N%-6) MOD 20 THEN 46471 ELSE GOSUB 46475
  1195. 46471  NEXT
  1196. 46472  IF MAX.POINTS%<70 THEN N%=MAX.POINTS%+5:GOSUB 46475:RETURN
  1197. 46474  '
  1198. 46475  DT=VAL.BUF!(N%+TERM!-6,4):GOSUB 51490:PR.OFF%=INT((LEN(DT.PRN$)-1)/2)
  1199. 46477  LOCATE AXIS%+1,N%-PR.OFF%:PRINT DT.PRN$:IF N%>6 THEN LOCATE AXIS%,N%:PRINT CHR$(NOTCH%);
  1200. 46479  RETURN
  1201. 46484  '
  1202. 46488  LOCATE X%,1:IF LAB.VAL!<-999 THEN PRINT USING "+####";LAB.VAL!;:RETURN
  1203. 46489  IF LAB.VAL!<0 THEN PRINT USING "+###";LAB.VAL!:RETURN
  1204. 46490  IF LAB.VAL!<99.99 THEN PRINT USING "##.#";LAB.VAL!:ELSE IF LAB.VAL!<9999.99 THEN PRINT USING "####";LAB.VAL!:ELSE PRINT LAB.VAL!
  1205. 46496  RETURN
  1206. 46500  '
  1207. 46502  FOR N%=TERM! TO MAX.POINTS%+TERM!-1
  1208. 46504    TEST.VAL!=VAL.BUF!(N%,TEST.FEELD%)
  1209. 46506    IF TEST.VAL!<MIN! THEN MIN!=TEST.VAL!
  1210. 46508    IF TEST.VAL!>MAX! THEN MAX!=TEST.VAL!
  1211. 46510  NEXT
  1212. 46512  RANGE!=MAX!-MIN!:SCALE!=RANGE!/(V.POINTS!-1)
  1213. 46514  RETURN
  1214. 46516  '
  1215. 46518  X.PT%=INT((VAL.IND!-MIN!)/SCALE!+0.5):X.PT%=SCR.PTS%-X.PT%
  1216. 46526  X.PT%=X.PT%-X.OFF!
  1217. 46528  RETURN
  1218. 46530  '
  1219. 46532  LOCATE X.PT%,Y.PT%:PRINT CHR$(PLOT.CHAR%)
  1220. 46540  IF NOT HIST.FLAG% THEN 46548
  1221. 46542  FOR Q%=X.PT%+1 TO SCR.PTS%:LOCATE Q%,Y.PT%:PRINT CHR$(PLOT.CHAR%):NEXT
  1222. 46548  RETURN
  1223. 46550  '
  1224. 46999  '
  1225. 47036  GOSUB 47200:GOSUB 45076:GOTO 48000
  1226. 47050  GOSUB 45184:GOSUB 46104:GOSUB 42730:GOSUB 42775:IF EDIT.BRANCH%=1 THEN GOSUB 49500
  1227. 47060  RUN
  1228. 47064  '
  1229. 47200  '
  1230. 47210  LOCATE 23,1:PRINT SPACE$(70):LOCATE 23,1:PRINT "Enter formula"
  1231. 47211    X%=23:Y%=15:TEST.TYP%=3:MAX.LN%=20:GOSUB 44000:EXP.ORIG$=INP.TMP$
  1232. 47212  LOCATE 23,1:PRINT SPACE$(70):LOCATE 23,1:PRINT "Enter descriptive label"
  1233. 47213    Y%=25:TEST.TYP%=3:MAX.LN%=16:GOSUB 44000:LABEL.1$=INP.TMP$
  1234. 47215  RETURN
  1235. 47999  '
  1236. 48000  GOSUB 42785:EXP.NEW$="":GOSUB 48040
  1237. 48005  OPEN "O",2,"TEMP.$$$"
  1238. 48010  PRINT #2, "49108 FILL.COUNT%=1:REC.NUM%=START.REC%:OUT.OF.DTA%=0:MAX.POINTS%=H.POINTS%
  1239. 48011  PRINT #2, "49128   VAL.BUF!(TERM!+FILL.COUNT%-1,BUF.LOC%)=" EXP.NEW$
  1240. 48012  PRINT #2, "49230   VAL.BUF!(TERM!-FILL.COUNT%,BUF.LOC%)=" EXP.NEW$
  1241. 48016  CLOSE #2
  1242. 48020  CHAIN MERGE "TEMP.$$$",49108,ALL
  1243. 48030  '
  1244. 48040  WHILE COUNT%<LEN(EXP.ORIG$)
  1245. 48056    COUNT%=COUNT%+1:TEST.1.CHAR$=MID$(EXP.ORIG$,COUNT%,1)
  1246. 48064    IF TEST.1.CHAR$="V" OR TEST.1.CHAR$="v" THEN GOSUB 48084:GOTO 48076    
  1247. 48068    IF FNNUMBER%(TEST.1.CHAR$) THEN GOSUB 48124:GOTO 48076
  1248. 48072    GOSUB 48140
  1249. 48076  WEND
  1250. 48080  RETURN 
  1251. 48084  '
  1252. 48088  TEST.2.CHAR$=MID$(EXP.ORIG$,COUNT%+1,1):IF NOT FNNUMBER%(TEST.2.CHAR$) THEN ERROR 150
  1253. 48092    TEST.1.CHAR$=TEST.2.CHAR$:COUNT%=COUNT%+1
  1254. 48096    EXP.TMP$="FNNUM.EXTRACT!(REC.TMP$,"+TEST.1.CHAR$
  1255. 48100    IF COUNT%=LEN(EXP.ORIG$) THEN 48112
  1256. 48104    TEST.2.CHAR$=MID$(EXP.ORIG$,COUNT%+1,1)
  1257. 48108    IF FNNUMBER%(TEST.2.CHAR$) THEN EXP.TMP$=EXP.TMP$+TEST.2.CHAR$:COUNT%=COUNT%+1
  1258. 48112  EXP.NEW$=EXP.NEW$+EXP.TMP$+")"
  1259. 48116  RETURN
  1260. 48120  '
  1261. 48124  EXP.NEW$=EXP.NEW$+TEST.1.CHAR$:RETURN
  1262. 48136  '
  1263. 48140  IF NOT FNOP%(TEST.1.CHAR$) THEN RETURN
  1264. 48148    EXP.NEW$=EXP.NEW$+TEST.1.CHAR$
  1265. 48152  RETURN
  1266. 48156  '
  1267. 49104  '
  1268. 49108  FILL.COUNT%=1:REC.NUM%=START.REC%:OUT.OF.DTA%=0:MAX.POINTS%=H.POINTS%
  1269. 49110  ON ERROR GOTO 60000:KILL "TEMP.$$$"
  1270. 49112  WHILE FILL.COUNT%<=H.POINTS% AND NOT OUT.OF.DTA%
  1271. 49116    IF REC.NUM%=LAST.REC% THEN OUT.OF.DTA%=-1
  1272. 49120    GET #1,REC.NUM%:REC.TMP$=RECORD$
  1273. 49124    IF LEFT$(REC.TMP$,4)=STRING$(4,0) OR LEFT$(REC.TMP$,4)=MKS$(32767) THEN 49136
  1274. 49128    VAL.BUF!(TERM!+FILL.COUNT%-1,BUF.LOC%)=FNNUM.EXTRACT!(REC.TMP$,8)-FNNUM.EXTRACT!(REC.TMP$,9)
  1275. 49129    IF STK.MOD% THEN VAL.BUF!(FILL.COUNT%+TERM!-1,4)=(REC.NUM%+START.DAT%-2)
  1276. 49130    IF BOND.MOD% THEN VAL.BUF!(FILL.COUNT%+TERM!-1,4)=CVS(DAT.REC$)
  1277. 49132    FILL.COUNT%=FILL.COUNT%+1
  1278. 49136    REC.NUM%=REC.NUM%+1
  1279. 49140  WEND
  1280. 49144  MAX.POINTS%=FILL.COUNT%-1
  1281. 49146  '
  1282. 49215  OUT.OF.DTA%=0:FILL.COUNT%=1:REC.NUM%=START.REC%-1
  1283. 49216  WHILE FILL.COUNT%<=TERM!-1 AND NOT OUT.OF.DTA%
  1284. 49220    IF REC.NUM%=2 THEN OUT.OF.DTA%=-1
  1285. 49224    GET #1,REC.NUM%:REC.TMP$=RECORD$
  1286. 49228    IF LEFT$(REC.TMP$,4)=STRING$(4,0) OR LEFT$(REC.TMP$,4)=MKS$(32767) THEN 49248
  1287. 49230    VAL.BUF!(TERM!-FILL.COUNT%,BUF.LOC%)=FNNUM.EXTRACT!(REC.TMP$,8)-FNNUM.EXTRACT!(REC.TMP$,9)
  1288. 49244    FILL.COUNT%=FILL.COUNT%+1
  1289. 49248    REC.NUM%=REC.NUM%-1
  1290. 49252  WEND
  1291. 49256  GOTO 47050
  1292. 49260  '
  1293. 49500  LOCATE ,,1:F1.MSG$="Output to text file":F2.MSG$="Output to DIF file":ESC.MSG$="Return to menu":GOSUB 42750:GOSUB 42776
  1294. 49501  IF EDIT.BRANCH%=3 THEN RETURN ELSE FIL.TYP%=EDIT.BRANCH%
  1295. 49502  LOCATE 24,1:PRINT SPACE$(79);:LOCATE 24,1:PRINT "Enter a file name";
  1296. 49503  X%=24:Y%=20:TEST.TYP%=3:MAX.LN%=12:GOSUB 44000:FL.OUT$=DR$+":"+INP.TMP$
  1297. 49508  GOSUB 42785
  1298. 49509  GOTO 49540
  1299. 49510  LBL$(4)="NYSE Volume"
  1300. 49520  LBL$(3)=STR$(TERM!)+"-Day M.A.":RETURN
  1301. 49530  LBL$(3)=LABEL.2$:RETURN
  1302. 49540  NV=4+(GRAF.TYP%>1):LBL$(1)="DATE":LBL$(2)=LABEL.1$:ON GRAF.TYP% GOSUB 49510, 49520, 49530
  1303. 49550  OPEN FL.OUT$ FOR OUTPUT AS #3
  1304. 49560  IF FIL.TYP%=2 THEN 49650
  1305. 49570  DASH$=STRING$(10,45):FOR I=2 TO NV:DASH$=DASH$+STRING$(15,45):NEXT I
  1306. 49580  PRINT #3, DASH$:OUTBUF$=LBL$(1)+"      ":PRINT #3, OUTBUF$;:FOR I=2 TO NV-1:OUTBUF$=SPACE$(15):RSET OUTBUF$=LBL$(I):PRINT #3, OUTBUF$;:NEXT I
  1307. 49590  OUTBUF$=SPACE$(15):RSET OUTBUF$=LBL$(NV):PRINT #3, OUTBUF$:PRINT #3, DASH$
  1308. 49600  FOR J=TERM! TO TERM!+MAX.POINTS%-1:DT=VAL.BUF!(J,4):GOSUB 51490:OUTBUF$=SPACE$(10):LSET OUTBUF$=DT.PRN$:PRINT #3, OUTBUF$;:PRINT #3, USING "############.##"; VAL.BUF!(J,1); VAL.BUF!(J,3+(GRAF.TYP%<>3));
  1309. 49610  IF GRAF.TYP%>1 THEN PRINT #3, "":GOTO 49630
  1310. 49620  OUTBUF$=SPACE$(15):RSET OUTBUF$=STR$(VAL.BUF!(J,3)):PRINT #3, OUTBUF$
  1311. 49630  NEXT J:PRINT #3, DASH$:GOTO 49770
  1312. 49650  PRINT #3, "TABLE":PRINT #3, "0,1":PRINT #3, CHR$(34);CHR$(34)
  1313. 49660  PRINT #3, "VECTORS":PRINT #3, "0,";NV:PRINT #3, CHR$(34);CHR$(34)
  1314. 49670  PRINT #3, "TUPLES":PRINT #3, "0,";MAX.POINTS%+1:PRINT #3, CHR$(34);CHR$(34)
  1315. 49690  PRINT #3, "DATA":PRINT #3, "0,0":PRINT #3, CHR$(34);CHR$(34)
  1316. 49710  PRINT #3, "-1,0":PRINT #3, "BOT"
  1317. 49720  PRINT #3, "1,0":PRINT #3,CHR$(34);LBL$(1);CHR$(34):FOR J=TERM! TO TERM!+MAX.POINTS%-1:DT=VAL.BUF!(J,4):GOSUB 51490:PRINT #3, "1,0":PRINT #3, CHR$(34);DT.PRN$;CHR$(34):NEXT J
  1318. 49730  FOR I=1 TO NV-1:PRINT #3, "-1,0":PRINT #3, "BOT":PRINT #3, "1,0":PRINT #3,CHR$(34);LBL$(I+1);CHR$(34)
  1319. 49740  FOR J=TERM! TO TERM!+MAX.POINTS%-1:IF I=NV-1 THEN T=I+ABS(GRAF.TYP%=3) ELSE T=I
  1320. 49745  PRINT #3, "0";VAL.BUF!(J,T):PRINT #3, "V":NEXT J:NEXT I
  1321. 49750  PRINT #3, "-1,0":PRINT #3, "EOD"
  1322. 49770  CLOSE #3
  1323. 49775  SCRATCH!=FRE(0):GOSUB 42792:LOCATE 24,1:PRINT SPACE$(79);:PRINT CHR$(7);:COLOR 0,7:LOCATE 24,1:PRINT "File output complete; press any key to return to menu";:COLOR 7,0:HOOK$=INPUT$(1):GOSUB 40190:RETURN
  1324. 49780  RETURN
  1325. 49999  '
  1326. 50950  DT.FLAG%=0:DAT$="":LOCATE 23,1:PRINT SPACE$(79);:LOCATE 23,1
  1327. 50960  IF GRAF.FLAG% THEN DT.PR$="Enter start date for graph" ELSE DT.PR$="Enter date"
  1328. 50975  PRINT DT.PR$+ " (ESC to return to menu)";
  1329. 50980  TEST.TYP%=2:X%=23:Y%=36-(16*GRAF.FLAG%):MAX.LN%=10:GOSUB 44000
  1330. 51010  DAT$=INP.TMP$:IF DAT$="" OR DAT$=CHR$(27) THEN RETURN
  1331. 51014  GOSUB 42785:GOSUB 51050
  1332. 51020  IF DT.FLAG% THEN ERROR 110
  1333. 51030  CUR.DAT$=DAT$:SCRATCH!=FRE(""):GOSUB 42792:RETURN
  1334. 51040  '
  1335. 51050  '
  1336. 51110  GOSUB 51180:GOSUB 51360:GOSUB 51490
  1337. 51140  IF MON.ORIG%<>MON.OUT OR DAY.ORIG%<>DAY.OUT OR YR.ORIG%<>YR.OUT THEN DT.FLAG%=-1 ELSE DT.FLAG%=0
  1338. 51150  DT.INT%=DT:SCRATCH!=FRE("")
  1339. 51160  RETURN
  1340. 51170  '
  1341. 51180  '
  1342. 51240  BRK.1%=0:BRK.2%=0
  1343. 51250  FOR N%=1 TO LEN(DAT$)
  1344. 51260    ELEM$=MID$(DAT$,N%,1)
  1345. 51270    IF ASC(ELEM$)>=48 AND ASC(ELEM$)<=57 THEN 51290
  1346. 51280    IF BRK.1%=0 THEN BRK.1%=N% ELSE BRK.2%=N%
  1347. 51290  NEXT
  1348. 51300  MON.ORIG%=VAL(LEFT$(DAT$,BRK.1%-1)):DAY.ORIG%=VAL(MID$(DAT$,BRK.1%+1,BRK.2%-BRK.1%-1))
  1349. 51320  YR.ORIG%=VAL(MID$(DAT$,BRK.2%+1,4)):IF YR.ORIG%>1999 THEN YR.ORIG%=YR.ORIG%-1900
  1350. 51340  RETURN
  1351. 51350  '
  1352. 51360  '
  1353. 51420  DAY.INP=DAY.ORIG%:MON.INP=MON.ORIG%:YR.INP=YR.ORIG%:YR.INP=YR.INP+1900
  1354. 51440  IF MON.INP<3 THEN YR.INP=YR.INP-1:MON.INP=MON.INP+13:ELSE:MON.INP=MON.INP+1
  1355. 51450  DT=INT(365.25*YR.INP)+INT(30.6001*MON.INP)+DAY.INP-722527
  1356. 51460  YR.INP=YR.INP-1900
  1357. 51470  RETURN
  1358. 51480  '
  1359. 51490  '
  1360. 51550  DT1=DT+722527:YR.OUT=INT((DT1-122.1)/365.25)
  1361. 51560  MON.OUT=INT((DT1-INT(365.25*YR.OUT))/30.6001)
  1362. 51570  DAY.OUT=DT1-INT(365.25*YR.OUT)-INT(30.6001*MON.OUT)
  1363. 51580  IF MON.OUT>13 THEN MON.OUT=MON.OUT-13 ELSE MON.OUT=MON.OUT-1
  1364. 51590  YR.OUT=YR.OUT-1900:IF MON.OUT<3 THEN YR.OUT=YR.OUT+1 
  1365. 51600  IF YR.OUT>99 THEN YR.PRN$=FNSTRIP$(YR.OUT+1900) ELSE YR.PRN$=FNSTRIP$(YR.OUT)
  1366. 51610  DT.PRN$=FNSTRIP$(MON.OUT)+"/"+FNSTRIP$(DAY.OUT)+"/"+YR.PRN$
  1367. 51620  RETURN
  1368. 52000  '
  1369. 52002  DAT$=DAT1$:GOSUB 51050:DT.1%=DT.INT%
  1370. 52004  IF YR.ORIG% MOD 4=0 AND MON.ORIG%<3 THEN Y.1.LEN%=366 ELSE Y.1.LEN%=365
  1371. 52006  DAT$=DAT2$:GOSUB 51050:DT.2%=DT.INT%
  1372. 52008  IF YR.ORIG% MOD 4=0 AND MON.ORIG%<3 THEN Y.2.LEN%=366 ELSE Y.2.LEN%=365
  1373. 52010  DBD%=DT.2%-DT.1%:RETURN
  1374. 52019  '
  1375. 59999  '
  1376. 60000  '
  1377. 60001  PRINT CHR$(7);
  1378. 60002  IF ERR=53 AND ERL=41500 THEN ERR.MSG$="STOKBOND.OVR not found; exiting to DOS...":GOSUB 63000:CLS:SYSTEM
  1379. 60003  IF ERR=53 THEN ERR.MSG$="File "+FIL$+" not found":GOSUB 63000:FLNF.FLAG%=-1:RESUME NEXT
  1380. 60010  IF ERL=41150 AND ERR=5 THEN ERR.MSG$="BASIC must be called with /S:160":GOSUB 63000:RESUME 11000
  1381. 60020  IF ERL=>44752 AND ERL<=44804 THEN PRINT CHR$(7):ERR.FLAG%=-1:RESUME 44758
  1382. 60025  IF ERL>=51240 AND ERL<=51340 THEN ERR.MSG$="Unexpected date error":GOSUB 63000:RESUME 50950
  1383. 60030  IF ERL=49550 THEN ERR.MSG$="Not a valid file name (output drive is "+DR$+")":GOSUB 63000:RESUME 49502
  1384. 60101  IF ERR=101 THEN RESP$="":RESUME 43050 
  1385. 60102  IF ERR=102 THEN RESP$="":RESUME 43550 
  1386. 60103  IF ERR=103 THEN RESP$="":RESUME 43760 
  1387. 60105  IF ERR=105 THEN RESP$="":RESUME 44100 
  1388. 60107  IF ERR=107 THEN ERR.MSG$="There is no such value":GOSUB 63000:RESUME 42486
  1389. 60108  IF ERR=108 THEN ERR.MSG$="You must delete a stock first":FULL.FLAG%=-1:GOSUB 63000:RESUME 22303
  1390. 60109  IF ERR=109 THEN ERR.MSG$="You must initialize a stock first":GOSUB 63000:RESUME 22000
  1391. 60110  IF ERR=110 THEN ERR.MSG$="There is no such date":GOSUB 63000:RESUME 50950
  1392. 60112  IF ERR=112 THEN ERR.MSG$=D.T.E$:GOSUB 63000:RESUME 42305
  1393. 60113  IF ERR=113 THEN ERR.MSG$=D.T.L$:GOSUB 63000:RESUME 42355
  1394. 60114  IF ERR=114 THEN ERR.MSG$=D.T.E$:GOSUB 63000:RESUME 42355
  1395. 60116  IF ERR=116 THEN ERR.FLAG%=-1:RESUME 44758
  1396. 60118  IF ERR=118 THEN ERR.MSG$=N.E.D$:GOSUB 63000:RESUME 20000
  1397. 60120  IF ERR=120 THEN ERR.MSG$=N.E.D$:GOSUB 63000:RESUME 30000
  1398. 60123  IF ERR=123 THEN ERR.MSG$=D.T.L$:GOSUB 63000:RESUME 42375
  1399. 60124  IF ERR=124 THEN ERR.MSG$=D.T.E$:GOSUB 63000:RESUME 42375
  1400. 60125  IF ERR=125 OR (ERL>45146 AND ERL<45157) THEN ERR.MSG$=N.E.D$:GOSUB 63000:IF STK.MOD% THEN RESUME 21400 ELSE IF STK.HIS% THEN RESUME 22650 ELSE RESUME 31400
  1401. 60299  ERR.MSG$="Unexpected error"+STR$(ERR)+" in"+STR$(ERL)+"; reloading":GOSUB 63000:RESUME 11000
  1402. 62999  '
  1403. 63000  '
  1404. 63004  '
  1405. 63005  LOCATE 2,1:COLOR 0,7:PRINT "ERROR";:COLOR 7,0
  1406. 63010  LOCATE 3,5:PRINT ERR.MSG$ " (ESC to clear)";:LOCATE 2,6
  1407. 63015  RESP$=INKEY$:IF RESP$="" THEN 63015
  1408. 63020    IF RESP$<>CHR$(27) THEN 63015
  1409. 63025    FOR Q%=2 TO 3:LOCATE Q%,1:PRINT SPACE$(59);:NEXT
  1410. 63030  RETURN
  1411.